【问题标题】:#Mongodb - How to get the size of an array WITHIN an array of objects?#Mongodb - 如何在对象数组中获取数组的大小?
【发布时间】:2021-06-21 13:09:57
【问题描述】:

我尝试在对象数组中获取数组的长度,但无论数组实际有多长,我总是得到 1。

我的更新查询如下所示:

   const list = await personalWordLists.updateOne(
        {"user_id": userID,  "lists.list_id": list_id }, 
        [
            {
                $set: {
                    "lists.last_practiced": last_practiced,
                    "lists.wordCount": { $size: "$lists.word_ids" } 
                }
            }
        ]
    )

当我查询 lists 的长度时,它会起作用并且我得到了正确的数组长度。

我的文档如下所示:

提前感谢您的帮助!

【问题讨论】:

  • 我已经更新了答案,看看这是不是你要找的……

标签: mongodb mongoose aggregation-framework


【解决方案1】:

您必须使用聚合管道支持更新命令,该命令适用于 MongoDB 版本 >= 4.2

$set 管道内使用$map 迭代lists 数组的元素并应用所需的条件和操作。在您的情况下,将现有键与 "wordCount": {"$size": "$$elemword_ids"} 以及您希望为匹配元素更改的其他键合并。

db.collection.update({
  // Your Match Conditions
  "user_id": userID,
  "lists.list_id": list_id,
},
[
  {
    "$set": {
      "lists": {
        "$map": {
          "input": "$lists",
          "as": "elem",
          "in": {
            "$cond": {
              "if": {
                "$eq": [
                  "$$elem.list_id",
                  list_id
                ]
              },
              "then": {
                "$mergeObjects": [
                  "$$elem",
                  {
                    "wordCount": {
                      "$size": "$$elem.word_ids"
                    },
                    "last_practiced": last_practiced
                  },
                ],
              },
              "else": "$$elem",
            },
          },
        }
      },
    },
  },
],
{
  multi: true
})

【讨论】:

  • 感谢您的回复!不幸的是,它只能部分起作用。大小值现在等于数组的长度,但查询会破坏文档(如您在此处看到的:snipboard.io/3AGHSn.jpg)。
  • 只是为了让事情清楚:我有一个列表对象数组。我只需要通过添加 word_ids 和日期来更新一个列表对象。之后,我想在该特定列表对象中添加 word_id 的数量。
  • 我完全误解了你的问题。对造成的不便深表歉意。我已经更新了我的答案,如果它对你有用,请告诉我
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
相关资源
最近更新 更多