javascript - 如何将多个文档合并为一个。数据库

标签 javascript mongodb

我想制作一个新文档,它从具有相同 buyer 的所有订单中获取所有 cartItems。如果它没有一对(比如 Leonard),它会生成新文档,但状态为 "orderId": "merged"

例如: 在某些情况下需要它,当一些客户会下几个不同的订单但我只需要提供一个综合配方时。

集合订单:

输入

{
    "_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 示例就更好了。

最佳答案

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 ;)

关于javascript - 如何将多个文档合并为一个。数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43411951/

相关文章:

javascript - 如何为 droppable td 编写接受条件,以便它只接受表中的邻居 td

php - Doctrine2 ODM 限制不起作用/mongodb

javascript - 如何禁用CKEditor自动添加标签 'a'

javascript - 以干净的方式扩展主干 View 和继承选项

javascript - MomentJS 检查 isBefore 没有日期

javascript - 外部JS : How to enforce the MaxLength to false at run time?

java - spring-data-mongodb: findAll() 包含输入文档列表和嵌入式 DBRef 文档的搜索参数

javascript - 如何保存 collection.findone() 的结果

python - 插入 mongodb (pymongo) 时的效率

mongodb - 如何在mgo中进行文本搜索?