【问题标题】:MongoDB - Move some fields from the array into another arrayMongoDB - 将一些字段从数组移动到另一个数组
【发布时间】:2023-01-08 10:50:47
【问题描述】:

我有这个简化的 MongoDB 文档,并且想更改一些内容,因为其中有很多冗余数据。此字段“activeUsersLookup”是聚合的结果,它返回我想放入第一个 users 数组中的数据。

第一个编号: "_id": "80b1565a-faf4-4e68-9bd6-8344060e8d3a"匹配 id 来自activeUsersLookup 用户 ID 也是如此。

[{
  "_id": "80b1565a-faf4-4e68-9bd6-8344060e8d3a",
  "users": [
    {
      "_id": "eaa946da-2708-443e-ab4c-b6db357050ca",
      "lastactive": {
        "$date": {
          "$numberLong": "1637922656000"
        }
      }
    },
    {
      "_id": "4972ba13-6f4e-4943-be07-15802e22e0dd",
      "lastactive": {
        "$date": {
          "$numberLong": "1653286066000"
        }
      }
    },
    {
      "_id": "6c4a62ce-c6c6-430f-a0cd-d348ec77dbb2",
      "lastactive": {
        "$date": {
          "$numberLong": "1558623982000"
        }
      }
    }
  ],
  "activeUsersLookup": [
    {
      "_id": "80b1565a-faf4-4e68-9bd6-8344060e8d3a",
      "users": [
        {
          "_id": "eaa946da-2708-443e-ab4c-b6db357050ca",
          "activities": 2
        },
        {
          "_id": "6c4a62ce-c6c6-430f-a0cd-d348ec77dbb2",
          "activities": 1
        }
      ],
      "sumOfActivities": 3
    }
  ]
}]

所以最终的文档或多或少应该是这样的:

[{
  "_id": "80b1565a-faf4-4e68-9bd6-8344060e8d3a",
  "users": [
    {
      "_id": "eaa946da-2708-443e-ab4c-b6db357050ca",
      "lastactive": {
        "$date": {
          "$numberLong": "1637922656000"
        }
      },
      "activities": 2
    },
    {
      "_id": "4972ba13-6f4e-4943-be07-15802e22e0dd",
      "lastactive": {
        "$date": {
          "$numberLong": "1653286066000"
        }
      },
      "activities": 0
    },
    {
      "_id": "6c4a62ce-c6c6-430f-a0cd-d348ec77dbb2",
      "lastactive": {
        "$date": {
          "$numberLong": "1558623982000"
        }
      },
      "activities": 1
    },
    "sumOfActivities": 3
  ]
}]

我试过:

{
    $addFields: {
      'licenses.activities': '$activeUsersLookup.users.activities'
    }
}

但这给了我一个空数组,所以我一定做错了什么。 下一阶段是将所有这些 activities 加起来为 sumOfActivities,最后一个阶段将取消设置 activeUsersLookup

我必须使用什么魔术才能获得所需的结果? :)

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    我认为您在 users 数组中为 "sumOfActivities": 3 发布的预期结果无效。

    假设您正在尝试实现如下结果:

    [{
      "_id": "80b1565a-faf4-4e68-9bd6-8344060e8d3a",
      "users": [...],
      "sumOfActivities": 3
    }]
    

    查询有点长:

    1. $set - 将 activeUsersLookup 字段设置为对象。

      1.1. $first - 从中​​获取第一个文档1.2.

      1.2. $filter - 通过将 activeUsersLookup 中的文档与 _id(根文档)匹配 _id 来过滤来自 activeUsersLookup 的文档。

    2. $set

      2.1. - 设置users数组。

      2.1.1. $map - 迭代users 数组中的文档并返回一个新数组。

      2.1.2. $mergeObjects - 将当前文档与带有 activities 字段的文档合并。

      2.1.3. $ifNull - 如果没有返回结果,则将 activities 设置为 02.1.4.

      2.1.4. $getField - 从结果中获取 activities 字段2.1.5.

      2.1.5. $first - 从结果中获取第一个文档2.1.6.

      2.1.6. $filter - 通过将文档(users 数组)的 _id 与当前文档的 _id 匹配来过滤 activeUsersLookup.users 文档。

      2.2.设置sumOfActivities字段。

    3. $unset - 删除activeUsersLookup 字段。

      db.collection.aggregate([
        {
          $set: {
            activeUsersLookup: {
              $first: {
                $filter: {
                  input: "$activeUsersLookup",
                  cond: {
                    $eq: [
                      "$$this._id",
                      "$_id"
                    ]
                  }
                }
              }
            }
          }
        },
        {
          $set: {
            users: {
              $map: {
                input: "$users",
                as: "user",
                in: {
                  $mergeObjects: [
                    "$$user",
                    {
                      activities: {
                        "$ifNull": [
                          {
                            "$getField": {
                              "field": "activities",
                              "input": {
                                $first: {
                                  $filter: {
                                    input: "$activeUsersLookup.users",
                                    cond: {
                                      $eq: [
                                        "$$this._id",
                                        "$$user._id"
                                      ]
                                    }
                                  }
                                }
                              }
                            }
                          },
                          0
                        ]
                      }
                    }
                  ]
                }
              }
            },
            sumOfActivities: "$activeUsersLookup.sumOfActivities"
          }
        },
        {
          $unset: "activeUsersLookup"
        }
      ])
      

      Sample Mongo Playground

    【讨论】:

    • 工作,非常感谢你!您应该在“mongodb 查询”类别中获得诺贝尔奖;)
    猜你喜欢
    • 2013-11-22
    • 2019-09-16
    • 2019-10-08
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多