微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在MongoDB驱动程序中为NodeJS使用嵌套数组?

如何解决如何在MongoDB驱动程序中为NodeJS使用嵌套数组?

我正在使用MongoDB Shell版本3.6.3。 我有两个集合1.用户2.业务 我在下面给出了示例数据。

user
********
_id : 1
username : "joyjeba2"
mobile_number : 9840347197,profile_url :"http://localhost:3001/user/1599214209351_dp1.jpg"
saved_products :[1,2]

Business
*****
_id:1
name : "businessname1"
location :"location",contact_number:123456,Products : [
{   "name": "product","tags": [
        "shoes","slippers"
    ],"description": "its a simple description","lower_price": 20,"higher_price": 30,"min_order": 20,"units": "count","media_urls": [
        "http://localhost:3001/product/1586703106075_DP1.jpg"
    ],"_id": 1
}
{   "name": "product","_id": 2
},]

现在,我想从用户集合中的saved_products到业务集合中的产品进行联接。

预期结果是:

_id : 1
username : "joyjeba2"
mobile_number : 9840347197,profile_url :"http://localhost:3001/user/1599214209351_dp1.jpg"
saved_product : [
{   "name": "product","_id": 1
    "_business_id":1,"business_name" : "businessname1"
    "location" :"location"
}
{   "name": "product","_id": 2,"_business_id":1,"business_name" : "businessname1"
    "location" :"location"
},],

当产品是单独的收藏品时(在查找和展开帮助下),我可以执行此操作。但是这里的产品作为嵌套文档位于业务集合中。我怎样才能做到这一点。请帮帮我。

解决方法

您可以尝试

  • $lookup使用管道,将saved_products传入let
  • $unwind解构Products数组
  • $match产品ID
  • $mergeObjects合并业务领域和产品领域
  • $replaceRoot替换根目录中的合并对象
db.user.aggregate([
  {
    $lookup: {
      from: "business",let: { saved_products: "$saved_products" },pipeline: [
        { $unwind: "$Products" },{ $match: { $expr: { $in: ["$Products._id","$$saved_products"] } } },{
          $replaceRoot: {
            newRoot: {
              $mergeObjects: [
                "$Products",{
                  _business_id: "$_id",business_name: "$name",location: "$location"
                }
              ]
            }
          }
        }
      ],as: "saved_products"
    }
  }
])

Playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。