繁体   English   中英

从另一个集合中获取数据 MongoDB 聚合 $lookup

[英]getdata from another collection MongoDB aggregate $lookup

我有以下两个collections: warehousesproducts

Warehouse 文档结构如下所示:

{
  _id: ObjectId("5f17dc2309ce612aa858b625")
  products:[ // product is string
    {product: "5f17dc3a09ce612aa858b627", count: 20}, 
    {product: "5f17dc3a09ce612aa858b628", count: 10}
  ] 
}

Product 文档结构如下所示:

{
  _id: ObjectId("5f17dc3a09ce612aa858b627")
  name: "Tomatos",
  price: 5
}

我需要使用aggregateproducts集合中的具有相同 id 的产品替换warehouse.products.product值。

我认为.populate('products.product')工作正常//不确定// 使用 find 时,但现在需要使用聚合

我正在寻找这个作为仓库集合的最终结果:

{
_id: ObjectId("5f17dc2309ce612aa858b625")
    products:[
        {
           
           count:20,
              product: {
                  name: "Tomatos",
                  price: 5
    }
        },
        {
           count:10,
           product: {
                name: "Oranges",
                price: 8
    }
        }
    ] 
}

我试过这个,但它不工作:

{
   $lookup:
     {
       from: "products",
       let: { "pr": "products.product"},
        pipeline: [
      { $addFields: { "id": { "$toString": "$_id" }}},
                  { $match: { $expr: { $eq: [ "$id", "$$pr" ] } } }

    ],
       as: "products.product"
     }
}
[{
    $unwind: {
        path: '$products'
    }
}, {
    $lookup: {
        from: 'item',
        'let': {
            pr: '$products.product'
        },
        pipeline: [{
            $match: {
                $expr: {
                    $eq: [{
                            $toString: '$_id'
                        },
                        '$$pr'
                    ]
                }
            }
        }],
        as: 'products.product'
    }
}, {
    $project: {
        "products.count": 1,
        "products.product": {
            $ifNull: [{
                    $arrayElemAt: ["$products.product", 0]
                },
                {

                }
            ]

        }
    }
}, {
    $group: {
        _id: '$_id',
        products: {
            $addToSet: '$products'
        }
    }
}]

工作Mongo游乐场

lookup提供了一个数组。 在您的情况下,您需要产品 object。 所以我希望产品总是有一个 object。 这就是为什么我使用 arrayElemAt 从数组中获取第一个ifNull ,并用arrayElemAt包裹,因为有时产品数组可以没有元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM