mongodb-将一些字段从数组移动到另一个数组

发布于 2025-02-14 00:18:42 字数 2224 浏览 0 评论 0 原文

我有这个简化的MongoDB文档,并且想更改某些内容,因为有很多冗余数据。该字段“ ActiveUserslookup”是聚合的结果,它返回了我想放入第一个用户 array中的数据。

第一个ID: “ _ 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'
    }
}

但是这给了我一个空数组,所以我必须做错了什么。 下一个阶段是将所有这些活动概括为 sumofactivitivitivities ,最后一个阶段将不设置 activeuserslookup

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

I have this simplified MongoDB document and would like to change something because there is quite a lot of redundant data. This field "activeUsersLookup" is the result of aggregation which returns data I'd like to put inside the first users array.

First id:
"_id": "80b1565a-faf4-4e68-9bd6-8344060e8d3a" matches
id from activeUsersLookup the same story is with user IDs.

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

So more or less the final document should look like this:

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

I've tried with:

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

But this gives me an empty array so I must be doing something wrong.
The next stage would be to sum all those activities as sumOfActivities and the last stage would be unset activeUsersLookup.

What magic tricks must I do to have the needed result? :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

禾厶谷欠 2025-02-21 00:18:42

我认为您对“ sumofactivities”发布的预期结果没有:3 用户数组中有效。

假设您正在尝试达到以下结果:

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

查询有点长:

  1. $ set - set activeuserslookup field aid object。

    1.1。 $ first - 从 1.2

    获取第一个文档

    1.2。 $ filter - activeuserslookup 通过匹配 _id activeuserslookup 中的文档 _id (根文档)。

  2. $ set

    2.1。 - 设置用户数组。

    2.1.1。 $ map - 迭代用户> randar中的文档并返回新数组。

    2.1.2。 $ MergeObjects - 将当前文档与活动合并字段。

    2.1.3。 $ ifnull - set 活动 as 0如果没有结果从 2.1.4

    返回

    2.1.4。 $ getfield - 从结果 2.1.5

    2.1.5。 $ first - 从结果 2.1.6

    中获取第一个文档

    2.1.6。 $ filter - 过滤 activeuserslookup.users 文档通过匹配 _id for 用户 array) > _id 当前文档。

    2.2。 SET sumofactivities 字段。

  3. $ unset - 删除 activeuserslookup field。

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"
  }
])

示例mongo playground

I don't think the expected result you posted for the "sumOfActivities": 3 in the users array is valid.

Assume that you are trying to achieve the result as below:

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

The query is a bit long:

  1. $set - Set activeUsersLookup field as object.

    1.1. $first - Get the first document from 1.2.

    1.2. $filter - Filter document(s) from activeUsersLookup by matching _id for the document in activeUsersLookup with _id (root document).

  2. $set

    2.1. - Set users array.

    2.1.1. $map - Iterate the documents in users array and return a new array.

    2.1.2. $mergeObjects - Merge current documents with the documents with activities field.

    2.1.3. $ifNull - Set activities as 0 if no result returned from 2.1.4.

    2.1.4. $getField - Get the activities field from the result 2.1.5.

    2.1.5. $first - Get the first document from the result 2.1.6.

    2.1.6. $filter - Filter the activeUsersLookup.users documents by matching _id for the document (users array) with _id for the current document.

    2.2. Set sumOfActivities field.

  3. $unset - Remove activeUsersLookup field.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文