EdW*_*ood 4 mongodb node.js mongodb-query
我有这个文件:
{
"_id" : ObjectId("5b673f525ef92ec6ef16504e"),
"events" : [
{
"name" : "Winner",
"map" : 0,
"something" : []
},
{
"name" : "Winner",
"map" : 2,
"something" : []
},
{
"name" : "DifferentName",
"map" : 2,
"something" : []
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我运行以下更新:
db.getCollection('test').updateOne({
"_id": ObjectId("5b673f525ef92ec6ef16504e"),
"events.name": "Winner",
"events.map": 2
},
{$push: {
"events.$.something": {
something: "test",
}
}
})
Run Code Online (Sandbox Code Playgroud)
我得到了不好的结果:
{
"_id" : ObjectId("5b673f525ef92ec6ef16504e"),
"events" : [
{
"name" : "Winner",
"map" : 0,
"something" : [
{
"something" : "test"
}
]
},
{
"name" : "Winner",
"map" : 2,
"something" : []
},
{
"name" : "DifferentName",
"map" : 2,
"something" : []
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为"something" : "test"应该位于第二个元素中,其中映射等于 2。
如果我将字段“name”更改为“a”并运行相同的更新,那么我会得到正确的结果:
{
"_id" : ObjectId("5b673f525ef92ec6ef16504e"),
"events" : [
{
"a" : "Winner",
"map" : 0,
"something" : []
},
{
"a" : "Winner",
"map" : 2,
"something" : [
{
"something" : "test"
}
]
},
{
"a" : "DifferentName",
"map" : 2,
"something" : []
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在您可以看到,“something”:“test”位于正确的位置(第二个事件)。这是因为我使用了“name”并且“name”是Mongo中的某种保留关键字吗?
当数组内有多个条件需要匹配时,该.Dot表示法不适用于更新查询。
您需要使用$elemMatch来匹配数组中的两个字段
db.getCollection('test').updateOne(
{
"_id": ObjectId("5b673f525ef92ec6ef16504e"),
"events": { "$elemMatch": { "name": "Winner", "map": 2 }}
},
{
"$push": { "events.$.something": { "something": "test" }}
}
)
Run Code Online (Sandbox Code Playgroud)