Агрегированный конвейер MONGODB

#mongodb #studio3t

#mongodb #studio3t

Вопрос:

наличие следующего документа :

 { 
"_id" : ObjectId("xxx"), 
"seller" : {
    "phone" : {
        "number" : "xx"
    }, 
    "nickname" : "xx"
}, 
"shipping" : {
    "id" : xx
}, 
"id" : yyy, 
"order_items" : {
    "item" : {
        "title" : "xxxyy"
    }, 
    "quantity" : 1
}}
  

и мне нужно преобразовать в этот результат

 { 
"_id" : ObjectId("xxx"), 
"seller.phone.number" : "xx",
"seller.nickname" : "xx", 
"shipping.id" : "xx",
"id" : yyy, 
"order_items.item.title" :"xxxyy",
"order_items.quantity" : 1
}
  

Как вы можете видеть, что мне нужно сделать, это выровнять документ до одного уровня
Я пытаюсь использовать следующий код, но мои выходные данные становятся вложенными

 db.getCollection("collection").aggregate(
    [
        { 
            "$unwind" : { 
                "path" : "$order_items"
            }
        }, 
        { 
            "$project" : { 
                "seller.phone.number" : 1.0, 
                "seller.nickname" : 1.0, 
                "shipping.id" : 1.0, 
                "id" : 1.0, 
                "order_items.item.title" : 1.0, 
                "order_items.quantity" : 1.0
            }
        }
    ], 
    { 
        "allowDiskUse" : false
    }
);
  

Я начинаю работать с mongodb и studio3t, буду признателен за любую помощь

Ответ №1:

Из документов Монго:

В противном случае, начиная с MongoDB 3.6, сервер разрешает хранение имен полей, содержащих точки (т.е. .) и знаки доллара (т.е. $).

Таким образом, хотя Mongo v3.6 допускает, чтобы имена полей содержали точки, они по-прежнему выдают следующее предупреждение:

До тех пор, пока не будет добавлена поддержка на языке запросов, использование $ и . в именах полей не рекомендуется и не поддерживается официальными драйверами MongoDB.

Итак, у studio3t есть пользовательский драйвер, который они используют, поскольку вы можете писать запросы на нескольких языках, но я считаю, что они просто используют основные драйверы, настроенные на ваш язык запросов.

Итак, что это значит? это означает, что драйвер анализирует seller.phone.number как вложенный объект.

Что вы можете сделать, так это изменить имена полей на стадии проекта:

 {
    "$project" : {
        "seller_phone_number": "$seller.phone.number",
        "seller_nickname": "$seller.nickname",
        "id": 1,
        "shipping_id": "$shipping.id",
        "order_item_quantity": "$order_items.quantity",
        "order_item_title": "$order_items.item.title",
    }
}