Node.js Mongoose:在另一个嵌套数组元素中更新数组,但未按预期工作
以下是我的mongo模式: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":
{
"_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