【问题标题】:Mongoose: Update of array inside another nested array element not working as expectedMongoose:另一个嵌套数组元素内的数组更新未按预期工作
【发布时间】:2021-02-01 04:56:27
【问题描述】:

这是我的 mongo 架构:

{
    "_id": ObjectId("5f8af2fc5f23667adf3bbaf2"),
    "score": 2.5,
    "questions": [{
            "_id": ObjectId("5f8af30d5f23667adf3bbaf5"),
            "desc": "some text",
        },
        {
            "_id": ObjectId("5f8af3115f23667adf3bbaf8"),
            "desc": "some text",
            "options": [{
                    "_id": ObjectId("5f8af3115f23667adf3bbaf9"),
                    "name": "some name",
                    "desc": "description 1"
                },
                {
                    "_id": ObjectId("5f8af3115f23667adf3bbafa"),
                    "name": "some name",
                    "desc": "description 2"
                }
            ]
        }
    ]
}

我必须更新 ID 为 5f8af3115f23667adf3bbaf9option 的名称和描述,它位于 array 元素 之一中id 为 5f8af30d5f23667adf3bbaf5question 属性又是 id5f8af2fc5f23667adf3bbaf2

的数据的一部分

尝试了以下查询,该查询已成功执行但未更新选项:

Model.findOneAndUpdate({
            _id : ObjectId("5f8af2fc5f23667adf3bbaf2"),
            "questions._id": ObjectId("5f8af30d5f23667adf3bbaf5"),
            "questions.options._id": ObjectId("5f8af3115f23667adf3bbaf9"),
        }, {
            $set: {
                "questions.$[q].options.$[o].order": data.order,
                "questions.$[q].options.$[o].definition": data.definition,
                "questions.$[q].options.$[o].type": data.type,
            },
          }, 
          { 
            arrayFilters: [{ "q._id": ObjectId(qid) }, { "o._id": ObjectId(oid) }]
         })

是否可以在单个 mongoose findOneAndUpdate 方法中完成?

【问题讨论】:

  • 我认为它没有更新,因为查询没有找到任何要更新的内容,因为您在问题下搜索 "_id": ObjectId("5f8af30d5f23667adf3bbaf5") 并且它没有选项数组。换个 id 试试
  • 仅供参考...当我尝试将 5f8af3115f23667adf3bbaf8 作为问题 ID 时,结果也相同

标签: node.js mongodb express mongoose mongodb-query


【解决方案1】:

您的查询是正确的,我刚刚在数组过滤器中硬编码了对象 id 值,它正在更新文档。正如你所说,我已经更新了名称和描述。试试这个。 mongoose 中的另一件事是,您必须将对象 ID 指定为“mongoose.Types.ObjectId”。 因此,在您的情况下,它就像 "q._id": mongoose.Types.ObjectId("5f8af3115f23667adf3bbaf8")。

还有一件事是您正在使用 findAndUpdate,请尝试仅根据您的 mongoose 版本使用更新

这里是 mongoplayground:

https://mongoplayground.net/p/TP5iCTAC5R_

查询:

db.collection.update({
  _id: ObjectId("5f8af2fc5f23667adf3bbaf2"),
  
"questions._id": ObjectId("5f8af3115f23667adf3bbaf8"),
  
"questions.options._id": ObjectId("5f8af3115f23667adf3bbaf9")
},

{
  $set: {
    "questions.$[q].options.$[o].name": "anotherName",
    "questions.$[q].options.$[o].desc": "anotherDesc"
  }
},

{
  arrayFilters: [
    {
      "q._id": ObjectId("5f8af3115f23667adf3bbaf8")
    },
    {
      "o._id": ObjectId("5f8af3115f23667adf3bbaf9")
    }
  ]
})

输出:

[
  {
    "_id": ObjectId("5f8af2fc5f23667adf3bbaf2"),
    "questions": [
      {
        "_id": ObjectId("5f8af30d5f23667adf3bbaf5"),
        "desc": "some text"
      },
      {
        "_id": ObjectId("5f8af3115f23667adf3bbaf8"),
        "desc": "some text",
        "options": [
          {
            "_id": ObjectId("5f8af3115f23667adf3bbaf9"),
            "desc": "anotherDesc",
            "name": "anotherName"
          },
          {
            "_id": ObjectId("5f8af3115f23667adf3bbafa"),
            "desc": "description 2",
            "name": "some name"
          }
        ]
      }
    ],
    "score": 2.5
  }
]

【讨论】:

  • 由于我已经导入了mongoose.Types.ObjectId,所以我只是使用了ObjectId
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2021-07-22
  • 2020-12-14
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
相关资源
最近更新 更多