2017-04-14 112 views
2

我想创建一个新文档,它从具有相同buyer的所有订单中获取所有cartItems。如果它没有一对(像伦纳德一样),它会创建新的文档,但状态为"orderId" : "merged"如何在一个文件中合并多个文件。 MongoDB

例如: 这是需要的情况下,当一些客户会做出几个不同的订单,但我只需要给一个合并配方。

收藏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提供的例子。

+0

我想你应该尝试的MongoDB聚集https://docs.mongodb.com/manual/reference/operator/aggregation/group/ –

回答

1
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的外壳,但它的JS)

+0

Thanx工作很好! –