0

具有以下文档:

{ 
"_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
}

如您所见,我需要做的是将文档展平为单个级别我正在尝试使用以下代码,但 mi 输出仍然嵌套

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 任何帮助将不胜感激

4

1 回答 1

1

来自 Mongo文档

否则,从 MongoDB 3.6 开始,服务器允许存储包含点(即 .)和美元符号(即 $)的字段名称。

因此,虽然 Mongo v3.6+ 确实允许字段名称包含点,但它们仍然提供以下警告:

在查询语言中添加支持之前,使用 $ 和 . 不推荐使用 in 字段名称,官方 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",
    }
}
于 2020-11-05T17:28:20.813 回答