mongodb嵌套数组元素$lookup

mongodb嵌套数组元素$lookup,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有两个系列,订单和产品。我喜欢将所有的order.items[]加入到products集合中,以向items[] 样本数据: 订单 [{u id:1,项目:[ {产品编号:1,价格:1.99,数量:2}, {产品编号:2,价格:3.99,数量:5}]] 产品 [{{u id:1,名称:“产品1},{{u id:2,名称:“产品2}] 预期输出: [{u id:1,项目:[ {产品id:1,名称:“产品1”,价格:1.99,数量:2}, {产品编号:2,名称:“产品2”,价格:3.99,数量

我有两个系列,
订单
产品
。我喜欢将所有的
order.items[]
加入到
products
集合中,以向
items[]

样本数据:
订单
[{u id:1,项目:[
{产品编号:1,价格:1.99,数量:2},
{产品编号:2,价格:3.99,数量:5}]]

产品
[{{u id:1,名称:“产品1},{{u id:2,名称:“产品2}]

预期输出:
[{u id:1,项目:[
{产品id:1,名称:“产品1”,价格:1.99,数量:2},
{产品编号:2,名称:“产品2”,价格:3.99,数量:5}]}]

我尝试过使用$lookup和pipeline(mongodb 3.6),但没有获得名称值,甚至匹配也不起作用


感谢您的帮助!

如果我没有使用v3.6,很抱歉,此查询将帮助您

db.orders.aggregate([
{
    $unwind: "$items"
},
{
     $lookup:
       {
         from: "products",
         localField: "items.product_id",
         foreignField: "_id",
         as: "tproduct"
       }
},
{ 
    $project: 
    {
        "_id" : 1,
        "items.product_id" : 1,
        "items.name" : { $arrayElemAt: ["$tproduct.name", 0] },
        "items.price" : 1,
        "items.qty" : 1
    }
},
{
    $group : 
    { 
        _id : "$_id", 
        items: { $push: "$items" } 
    }
}
])
我将解释四个阶段:

  • $unwind将为数组中的每个元素创建一个对象
  • $lookup将找到正确的产品,请记住该产品。\u id应该是唯一的
  • $project将格式化我的文档和items.name中的内容。我将使用查找语句的第一个元素
  • $group将使用_id对每个项目进行分组并将其推入新数组
  • 我很确定有更简洁、更简单的方法来编写,但这应该不会有问题。

    遵循这一点