首页 > 解决方案 > 合并不同集合的两个对象并在Mongodb中获取特定数据

问题描述

我有两个系列,产品和订单。

products收藏看起来像这样。

[
    {
        "_id": "5efb56741c32133bf43ea9aa",
        "title": "Xyz",
        "image": "172e4eb73415b3cc8540e651.jpg",
        "quantity": "1 Ltr",
        "price": 1500,
        "status": true,
        "creationDate": "2020-06-30T15:12:52.570Z",
        "__v": 0
    },
    {
        "_id": "5f0079bd27a734424cb3069a",
        "title": "abc",
        "image": "122e4eb73413b3cc854n42n1.jpg",
        "quantity": "500 ml",
        "price": 700,
        "status": true,
        "creationDate": "2020-06-30T15:12:52.570Z",
        "__v": 0
    }
]

orders收藏看起来像这样。

[
    {
        "_id": "5efca937def27b74fc9f6aa6",
        "products": [
            {
                "Date": "2020-07-01T15:14:36.630Z",
                "_id": "5efca937def27b74fc9f6aa8",
                "productId": "5efb56741c32133bf43ea9aa",
                "productQuantity": 2
            },
            {
                "Date": "2020-07-01T15:14:36.630Z",
                "_id": "5efca937def27b74fc9f6aa7",
                "productId": "5f0079bd27a734424cb3069a",
                "productQuantity": 1
            }
        ],
        "totalQuantity": 3,
        "totalPrice": 3700,
        "creationDate": "2020-07-01T15:18:15.756Z",
        "__v": 0
    },
    {
        "_id": "5efca897def27b74fc9f6aa2",
        "products": [
            {
                "Date": "2020-07-01T15:14:36.630Z",
                "_id": "5efca897def27b74fc9f6aa3",
                "productId": "5f0079bd27a734424cb3069a",
                "productQuantity": 1
            }
        ],
        "totalQuantity": 1,
        "totalPrice": 700,
        "creationDate": "2020-07-01T15:15:35.422Z",
        "__v": 0
    }
]

使用这两个集合我怎样才能得到这样的结果:

[
    {
        "_id": "5efca937def27b74fc9f6aa6",
        "products": [
            {
                "Date": "2020-07-01T15:14:36.630Z",
                "_id": "5efca937def27b74fc9f6aa8",
                "productId": "5efb56741c32133bf43ea9aa",
                "productQuantity": 2,
                "title": "Xyz",
                "image": "172e4eb73415b3cc8540e651.jpg",
                "quantity": "1 Ltr",
                "price": 1500
            },
            {
                "Date": "2020-07-01T15:14:36.630Z",
                "_id": "5efca937def27b74fc9f6aa7",
                "productId": "5f0079bd27a734424cb3069a",
                "productQuantity": 1,
                "title": "abc",
                "image": "122e4eb73413b3cc854n42n1.jpg",
                "quantity": "500 ml",
                "price": 700
            }
        ],
        "totalQuantity": 3,
        "totalPrice": 3700,
        "creationDate": "2020-07-01T15:18:15.756Z",
        "__v": 0
    },
    {
        "_id": "5efca897def27b74fc9f6aa2",
        "products": [
            {
                "Date": "2020-07-01T15:14:36.630Z",
                "_id": "5efca897def27b74fc9f6aa3",
                "productId": "5f0079bd27a734424cb3069a",
                "productQuantity": 1,
                "title": "abc",
                "image": "122e4eb73413b3cc854n42n1.jpg",
                "quantity": "500 ml",
                "price": 700
            }
        ],
        "totalQuantity": 1,
        "totalPrice": 700,
        "creationDate": "2020-07-01T15:15:35.422Z",
        "__v": 0
    }
]

标签: mongodbmongoose

解决方案


我使用这个查询得到了结果。

order.aggregate([
    { "$unwind": "$products" },
    {
        $lookup: {
            from: 'products',
            localField: "products.productId",
            foreignField: "_id",
            as: "product"
        }
    },
    {
        "$addFields": {
            "products": { $mergeObjects: [{ $arrayElemAt: ["$product", 0] }, "$$ROOT.products"] }
        }
    },
    {
        "$group": {
            "_id": "$_id",
            "products": { "$push": "$products" },
            "totalQuantity": { $first: '$totalQuantity' },
            "totalPrice": { $first: '$totalPrice' },
            "creationDate": { $first: '$creationDate' }
        }
    }
])

推荐阅读