У меня есть следующий документ:
{
"_id": "5a5cae1890254804e3a4655d",
"additional_ingredient": {
"concentration": 40.0,
"formulations": [
"5a1826c664f7fe04afbe9198"
]
}
}
Внутри additional_ingredient есть поле массива formulations. Когда у меня есть поле массива на первом уровне документа, я могу использовать $unwind, затем $lookup, чтобы присоединиться к внешнему документу и группе по этому полю.
Но я не могу сделать то же самое с вложенным массивом. Какое для этого лучшее решение?
Чего я жду:
{
"_id": "5a5cae1890254804e3a4655d",
"additional_ingredient": {
"concentration": 40.0,
"formulations": [
{
"_id": "5a1826c664f7fe04afbe9198",
"date_created": "Fri, 24 Nov 2017 14:03:50 GMT",
"date_modified": "Fri, 24 Nov 2017 14:03:50 GMT",
}
]
}
}
У меня проблема с группировкой. The field name 'additional_ingredient.formulations' cannot contain '.'
Это часть запроса:
{"$unwind": "$additional_ingredient.formulations"},
self.__ADDITIONAL_INGREDIENT_FORMULATION_LOOKUP_QUERY,
{"$unwind": "$additional_ingredient.formulations"},
{"$group": {
"_id": "$_id",
"additional_ingredient.formulations": {"$push": "$additional_ingredient.formulations"},
}},
У меня проблема во время группировки. `Имя поля 'additional_ingredient.formulations' не может содержать '.' '
это не ясно, вы можете добавить свой запрос здесь или открыть другой вопрос с более подробной информацией
Это была опечатка @felix. Они имели в виду: {"$unwind": "$additional_ingredient.formulations" }. Все выражения пути к полю нуждаются в $, в противном случае они представляют собой просто строку.
С другой стороны, почему вы делаете $unwindперед$lookup? Это была проблема в более старых версиях MongoDB, но на какое-то время она была исправлена. Попробуйте сначала сделать $lookup без $unwind, чтобы у вас не было нескольких операций $unwind, замедляющих работу. Это нормально до $group, но до этого оно вам не понадобится.
@ neil-lunn Спасибо за ваше замечание о $unwind до $lookup. Фиксированный. Но все же не знаю, как сгруппировать вложенное поле.
Вы не можете использовать имя поля, разделенное точками, в качестве цели для аккумулятора. Вам нужно сделать что-то вроде: "formulations": {"$push": "$additional_ingredient.formulations"}. Если вам нужен вложенный вывод, вам нужно переименовать его с последующим $project или подобным этапом ($addFields, $replaceRoot).



$unwindна вложенном массиве тоже работают. Используйте{"$unwind": "additional_ingredient.formulations" }