Я делаю aggregation
с project
с cond
. Что-то вроде этого ...
Пусть документ о:
{outter:{
inner1:"blah",
innerOther:"somethingelse"
}}
Aggregation:
db.collection.aggregate([{
$project : {
"outter.inner1":1,
"outter.inner2":{
$cond : if:{"outter.innerOther":{$exists:true}},
then:{"blah":"blah"},
else:{"blah":"blah"}
}
}
}])
Когда я запускаю это я получаю сообщение об ошибке: exception: dotted field names are only allowed at the top level
на if
техническом состоянии (я пробовал замены если с if:true
и агрегация работает).
Это ошибка? Есть ли обходной путь без выполнения всего другого проекта, чтобы просто получить доступное поле без точки?
EDIT
Так что я нашел обходной путь, но все-таки хотелось бы, чтобы увидеть, если это ожидаемое поведение. Обходным путем является использование переменной в проекции через $let
. Кроме того, похоже, что $exists
недействителен expression
, поэтому также необходимо внести следующие изменения.
db.collection.aggregate([{
$project : {
"outter.inner1":1,
"outter.inner2":{
$let :{
vars:{innerOther:{$ifNull:["$outter.innerOther", "absent"]}},
}
$cond : if:{$eq:["$$innerOther","absent"]},
then:{"blah":"blah"},
else:{"blah":"blah"}
}
}
}])
Является ли "Outter" массив? пожалуйста, можете ли вы показать свои документы? – styvane
Outter - это субдокумент. –