【问题标题】:how to use lookup on array object mongodb如何在数组对象mongodb上使用查找
【发布时间】:2021-06-12 16:23:08
【问题描述】:

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

所有的 ObjectId 都是不真实的

stockIn 文件

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

    ]
 }

我有一个产品系列

[
  {
   _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"
          }
       }

    ]
 }

这个集合只是从真实案例中简化而来。

问题我不知道如何在 mongodb 上进行查询,所以输出将与预期相同。感谢您的帮助

【问题讨论】:

  • 到目前为止您尝试了什么?他们已经用代码示例清楚地解释了一切。试试看,如果你对代码有任何问题,然后问。 docs.mongodb.com/manual/reference/operator/aggregation/lookup
  • 谢谢,兄弟。我只是从文档对象的第一级尝试lookup,当我尝试子集合数组时,我看不到我的期望

标签: javascript node.js mongodb nosql


【解决方案1】:

你可以使用$lookup

  • $unwind 解构数组
  • $lookup加入收藏
  • $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

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多