Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose:在另一个嵌套数组元素中更新数组,但未按预期工作_Node.js_Mongodb_Express_Mongoose_Mongodb Query - Fatal编程技术网

Node.js Mongoose:在另一个嵌套数组元素中更新数组,但未按预期工作

Node.js Mongoose:在另一个嵌套数组元素中更新数组,但未按预期工作,node.js,mongodb,express,mongoose,mongodb-query,Node.js,Mongodb,Express,Mongoose,Mongodb Query,以下是我的mongo模式: { "_id": ObjectId("5f8af2fc5f23667adf3bbaf2"), "score": 2.5, "questions": [{ "_id": ObjectId("5f8af30d5f23667adf3bbaf5"), "desc":

以下是我的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为5f8af3115f23667adf3bbaf9的选项的名称和描述,该选项位于问题属性的数组元素之一,id为5f8af30d5f23667adf3bbaf5,它也是id为的数据的一部分5f8af2fc5f23667adf3bbaf2

尝试了以下正在成功执行但未更新选项的查询:

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值,它正在更新文档。我已经更新了你说的名字和描述。一定要试试这个。在mongoose中还有一件事,您必须将对象id指定为“mongoose.Types.ObjectId”。 因此,在您的例子中,它类似于“q._id”:mongoose.Types.ObjectId(“5f8af3115f23667adf3bbaf8”)

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

这里是mongoplayground:

_

查询:

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

您的查询是正确的,我刚刚在数组过滤器中硬编码了对象id值,它正在更新文档。我已经更新了你说的名字和描述。一定要试试这个。在mongoose中还有一件事,您必须将对象id指定为“mongoose.Types.ObjectId”。 因此,在您的例子中,它类似于“q._id”:mongoose.Types.ObjectId(“5f8af3115f23667adf3bbaf8”)

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

这里是mongoplayground:

_

查询:

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

我认为它没有更新,因为查询没有找到任何要更新的内容,因为您正在问题下搜索“_id”:ObjectId(“5f8af30d5f23667adf3bbaf5”),并且它没有选项数组。尝试使用另一个供参考的id…当我尝试使用5f8af3115f23667adf3bbaf8作为问题id时,同样的结果我认为它没有更新,因为查询没有找到任何要更新的内容,因为您正在问题下搜索“_id”:ObjectId(“5f8af30d5f23667adf3bbaf5”),并且它没有选项数组。尝试使用另一个id作为参考…当我尝试使用5f8af3115f23667adf3bbaf8作为问题id时,同样的结果是我已经导入了mongoose.Types.ObjectId,我只是使用ObjectId,因为我已经导入了mongoose.Types.ObjectId,我只是使用了ObjectId