我的mongodb数据是这样的,由于数组中的数组有点复杂。
{
"_id" : ObjectId("5e36950f65fae21293937594"),
"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [
{
"noteId" : ObjectId("5e36953665fae212939375a0"),
"time" : ISODate("2020-02-02T17:24:06.460Z"),
"memoryLine" : [
{
"_id" : ObjectId("5e36953665fae212939375ab"),
"memoryTime" : ISODate("2020-02-03T17:54:06.460Z"),
"hasReviewed": false
},
{
"_id" : ObjectId("5e36953665fae212939375aa"),
"memoryTime" : ISODate("2020-02-03T05:24:06.460Z"),
"hasReviewed": false
}
]
}
]}
我想用_id更新memoryLine中的hasReviewed。例如,我想将_id:ObjectId(5e36953665fae212939375ab)
项目的 hasReviewed 更新为 true 。如预期的那样:
{
"_id" : ObjectId("5e36950f65fae21293937594"),
"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [
{
"noteId" : ObjectId("5e36953665fae212939375a0"),
"time" : ISODate("2020-02-02T17:24:06.460Z"),
"memoryLine" : [
{
"_id" : ObjectId("5e36953665fae212939375ab"),
"memoryTime" : ISODate("2020-02-03T17:54:06.460Z"),
"hasReviewed": true <============here updated to true
},
{
"_id" : ObjectId("5e36953665fae212939375aa"),
"memoryTime" : ISODate("2020-02-03T05:24:06.460Z"),
"hasReviewed": false
}
]
}
]}
如何处理?谢谢。
答案 0 :(得分:1)
您可以在.updateOne()中使用 arrayFilters 来做到这一点:
db.collection.update({ 'notes.memoryLine._id': ObjectId("5e36953665fae212939375ab") },
{ $set: { "notes.$[].memoryLine.$[element].hasReviewed": true } },
{ arrayFilters: [{ "element._id": ObjectId("5e36953665fae212939375ab") }] })
注意::由于 memoryLine 是 notes 数组对象内部的数组,因此此notes.$[]
将更新所有对象 memoryLine.hasReviewed 更改为 true ,否则,如果您只想更新第一个匹配的对象,则可以使用notes.$
。另外,您可以使用.updateOne()
代替.updateMany()
来更新多个文档。
答案 1 :(得分:0)
我为此找到了解决方案。
db.notes.updateOne({
userId:"5e33ee0b4a3895a6d246f3ee",
'notes.0.memoryLine._id': ObjectId("5e36953665fae212939375ab"),
}, {
'$set': {
'notes.0.memoryLine.$.hasReviewed': true
}
});