Как я могу сгруппировать поле в поддокументе в MongoDB

У меня есть следующий документ:

{
    "_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"},
            }},
$unwind на вложенном массиве тоже работают. Используйте {"$unwind": "additional_ingredient.formulations" }
felix 18.04.2018 11:01

У меня проблема во время группировки. `Имя поля 'additional_ingredient.formulations' не может содержать '.' '

thundera 18.04.2018 11:04

это не ясно, вы можете добавить свой запрос здесь или открыть другой вопрос с более подробной информацией

felix 18.04.2018 11:07

Это была опечатка @felix. Они имели в виду: {"$unwind": "$additional_ingredient.formulations" }. Все выражения пути к полю нуждаются в $, в противном случае они представляют собой просто строку.

Neil Lunn 18.04.2018 11:09

С другой стороны, почему вы делаете $unwindперед$lookup? Это была проблема в более старых версиях MongoDB, но на какое-то время она была исправлена. Попробуйте сначала сделать $lookup без $unwind, чтобы у вас не было нескольких операций $unwind, замедляющих работу. Это нормально до $group, но до этого оно вам не понадобится.

Neil Lunn 18.04.2018 11:12

@ neil-lunn Спасибо за ваше замечание о $unwind до $lookup. Фиксированный. Но все же не знаю, как сгруппировать вложенное поле.

thundera 18.04.2018 11:19

Вы не можете использовать имя поля, разделенное точками, в качестве цели для аккумулятора. Вам нужно сделать что-то вроде: "formulations": {"$push": "$additional_ingredient.formulations"}. Если вам нужен вложенный вывод, вам нужно переименовать его с последующим $project или подобным этапом ($addFields, $replaceRoot).

Neil Lunn 18.04.2018 11:31
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
7
53
0

Другие вопросы по теме