首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带展开的MongoDB条件聚合

带展开的MongoDB条件聚合
EN

Stack Overflow用户
提问于 2022-06-24 14:03:01
回答 1查看 95关注 0票数 0

我收集的数据库如下:

代码语言:javascript
复制
{
  "_id" : "af5c00e4-d3a8-419d-8793-c0cf328802ec",
    "collaborators" : [
        {
            "_id" : "9bd2eee8-bf6c-4c6f-bab7-d2d175aed807",
            "origin" : [
                {
                    "originId" : "123"
                }
            ],
            "firstName" : "Parveen",
            "lastName" : "Vendor",
            "email" : "pk@gmail.com"
        },
        {
            "_id" : "234324-bf6c-4c6f-bab7-d2d175aed807",
            "origin" : [
                {
                    "originId" : "1234"
                }
            ],
            "firstName" : "Parveen123",
            "lastName" : "34",
            "email" : "abc@gmail.com"
        }
    ],
    "orders" : [
        {
            "totalAmount" : 10,
            "collaborators" : [
                {
                    "origin" : [
                        {
                            "originId" : "123",
                        }
                    ],
                    "type" : "Supplier"
                },
                {
                    "origin" : [
                        {
                            "originId" : "1233",
                        }
                    ],
                    "type" : "Supplier"
                }
            ]
        }
    ]
}

希望将orders (数组)协作者(数组)中的数据替换为

**协作者(数组)**数据(如果匹配两者的originId )

预期输出

代码语言:javascript
复制
{
  "_id" : "af5c00e4-d3a8-419d-8793-c0cf328802ec",
    "collaborators" : [
        {
            "_id" : "9bd2eee8-bf6c-4c6f-bab7-d2d175aed807",
            "origin" : [
                {
                    "originId" : "123"
                }
            ],
            "firstName" : "Parveen",
            "lastName" : "Vendor",
            "email" : "pk@gmail.com"
        },
        {
            "_id" : "234324-bf6c-4c6f-bab7-d2d175aed807",
            "origin" : [
                {
                    "originId" : "1234"
                }
            ],
            "firstName" : "Parveen123",
            "lastName" : "34",
            "email" : "abc@gmail.com"
        }
    ],
    "orders" : [
        {
            "totalAmount" : 10,
            "collaborators" : [
                {
                    "_id" : "9bd2eee8-bf6c-4c6f-bab7-d2d175aed807",
                    "origin" : [
                        {
                            "originId" : "123"
                        }
                    ],
                    "firstName" : "Parveen",
                    "lastName" : "Vendor",
                    "email" : "pk@gmail.com"
                },
                {
                    "origin" : [
                        {
                            "originId" : "1233",
                        }
                    ],
                    "type" : "Supplier"
                }
            ]
        }
    ]
}

一个集合记录可以有多个协作者,与order可以有多个协作者相同。只需要在originId匹配的地方替换

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-26 20:09:19

一种选择是:

  1. 使用$map$mergeObjects$filterorders.collaborators的每个项添加一个new键,如果存在,则使用collaborators中的匹配项。
  2. 如果包含数据,则选择new键;如果不包含数据,则选择original键。
代码语言:javascript
复制
db.collection.aggregate([
  {$set: {
      ordersCollaborators: {
        $map: {
          input: {$first: "$orders.collaborators"},
          in: {$mergeObjects: [
              {original: "$$this"},
              {new: {
                  $filter: {
                    input: "$collaborators",
                    as: "i",
                    cond: {
                      $eq: [
                        {$first: "$$i.origin.originId"},
                        {$first: "$$this.origin.originId"}
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  {$set: {
      orders: [
        {totalAmount: {$first: "$orders.totalAmount"},
          collaborators: {
            $map: {
              input: "$ordersCollaborators",
              in: {
                $cond: [
                  {$eq: [{$size: "$$this.new"}, 0]},
                  "$$this.original",
                  "$$this.new"
                ]
              }
            }
          }
        }
      ],
      ordersCollaborators: "$$REMOVE"
    }
  }
])

看看它如何在操场实例上工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72745258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档