如何将多个文档合并为一个。MongoDB

3
我想创建一个新文档,获取所有具有相同买家的订单中的所有购物车项目。如果它没有成对的(比如Leonard),就会创建一个新文档,但状态为"orderId" : "merged"
例如: 这在某些客户下多个不同订单但需要提供仅合并的一张收据的情况下是必需的。
集合orders输入
{
    "_id" : "001",
    "buyer": "Sheldon"
    "cartItems" : [ 
        {
            "itemName" : "Water",
            "itemPrice" : 3
        }
    ],
    "totalCost" : 3
},
{
    "_id" : "002",
    "buyer" : "Sheldon",
    "cartItems" : [ 
        {
            "itemName" : "Milk",
            "itemPrice" : 2
        }
    ],
    "totalCost" : 2
},
{
    "_id" : "003",
    "buyer" : "Sheldon",
    "cartItems" : [ 
        {
            "itemName" : "Butter",
            "itemPrice" : 4
        }
    ],
    "totalCost" : 4
},
{
    "_id" : "004",
    "buyer" : "Leonard",
    "cartItems" : [ 
        {
            "itemName" : "Water",
            "itemPrice" : 3
        }
    ],
    "totalCost" : 3
}

输出

{
    "_id" : "003_new",
    "buyer" : "Sheldon",
    "cartItems" : [ 
        {
            "itemName" : "Water",
            "itemPrice" : 3
        },
        {
            "itemName" : "Milk",
            "itemPrice" : 2
        },
        {
            "itemName" : "Butter",
            "itemPrice" : 4
        } 
    ],
    "totalCost" : 9,
    "orderId" : "merged"
},
{
    "_id" : "004_new",
    "buyer" : "Leonard",
    "cartItems" : [ 
        {
            "itemName" : "Water",
            "itemPrice" : 3
        }
    ],
    "totalCost" : 3,
    "orderId" : "merged"
}

更好的做法是用JS提供一个示例。

我认为你应该尝试一下MongoDB的聚合操作。你可以参考这个链接:https://docs.mongodb.com/manual/reference/operator/aggregation/group/ - Anish Agarwal
1个回答

2
db.orders.aggregate([
    {$sort: {_id: 1, buyer: 1}},
    {$unwind: '$cartItems'},
    {$group: {_id: '$buyer', cartItems: {$push: '$cartItems'},
        totalCost: {$sum: '$totalCost'},
        id: {$last: {$concat: ["$_id", "_", "new" ]}},
        buyer: {$last: '$buyer'}}},
    {$addFields: {orderId: 'merged', _id: '$id'}},
    {$project: {"id": 0 }}])

顺便说一下,这是MongoDB的shell,但它是JS。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接