如何在数组 object mongodb 上使用查找

how to use lookup on array object mongodb

我是 mongodb 的新手。所以我尝试为我的 collection 设计架构如下

all the ObjectId is not real

stockIn 文档

 {
   serial:"stk0001",
   date:'2021-06-11',
   productInTransation:[
       {
         _id:"60ae220b066b8d9861118cb1",
         productId:"60ae220b066b8d9861118cb2"
         qty:2
       },
       {
        _id:"60ae220b066b8d9861118cb1",
        productId:"60ae220b066b8d9861118cb1",
        qty:2
       }

    ]
 }

我有一个 产品 collection

[
  {
   _id:"60ae220b066b8d9861118cb5",
   name:"sepatu"
  },
  {
   _id:"60ae220b066b8d9861118cb4",
   name:"sendal"
  }
]

所以我对这些文档的期望如下所示

 {
   serial:"stk0001",
   date:'2021-06-11',
   productInTransation:[
       {
         _id:"60ae220b066b8d9861118cb1",
         productId:"60ae220b066b8d9861118cb2"
         qty:2,
         product:
           {
              _id:"60ae220b066b8d9861118cb5",
              name:"sepatu"
           },
       },
       {
        _id:"60ae220b066b8d9861118cb1",
        productId:"60ae220b066b8d9861118cb1",
        qty:2,
        product:
          {
             _id:"60ae220b066b8d9861118cb4",
              name:"sendal"
          }
       }

    ]
 }

this collection is just simplified from the real case.

问题是我不知道如何对 mongodb 进行查询,因此输出将与预期相同。感谢您的帮助

您可以使用$lookup

  • $unwind解构数组
  • $lookup加入collections
  • $ifNull 以确保当我们使用 $arrayElemAt
  • 从连接数组中获取第一个元素时,这不会产生任何 NPE
  • $group重构数组

这是代码

db.stockIn.aggregate([
  { $unwind: "$productInTransation" },
  {
    "$lookup": {
      "from": "products",
      "localField": "productInTransation.productId",
      "foreignField": "_id",
      "as": "productInTransation.product"
    }
  },
  {
    "$addFields": {
      "productInTransation.product": {
        "$ifNull": [ { "$arrayElemAt": [ "$productInTransation.product", 0 ] }, [] ]
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "date": { "$first": "$date" },
      "serial": { "$first": "$serial" },
      "productInTransation": { $push: "$productInTransation" }
    }
  }
])

工作Mongo playground