我正在尝试使用'$'来更新列表中的某个项目。该项由firstName和lastName确定,在这种情况下,firstName + lastName组合是唯一的。
所以这是我的文件
{
"_id" : ObjectId("592403125ec4f65fb02e36a0"),
"friends" : [
{
"age" : 30.0,
"fname" : "qiang",
"lname" : "he"
},
{
"age" : 31.0,
"fname" : "deng",
"lname" : "pan"
},
{
"age" : 22.0,
"fname" : "xiong",
"lname" : "lan"
},
{
"age" : 23.0,
"fname" : "qiang",
"lname" : "lan"
}
]
}
所以我试图改变Qiang Lan的年龄,这是列表中的第3项。但是他与第0项具有相同的firstName,而第2项与第2项相同。我使用的代码是:
db.getCollection('test').update({'friends.fname': 'qiang', 'friends.lname': 'lan'}, {$set:{'friends.$.age': 50}})
这段代码并没有改变Qiang Lan的年龄,但它改变了0项Qiang He的年龄为50岁,这是我最早的一个术语。因此,条款实际上被视为OR,而不是AND。
我知道这可以通过添加一个等于firstName + lastName的fullName字段来解决,并在更新时匹配fullName。我只想弄明白,'$'是故意这样做的,还是我错了?
谢谢!
答案 0 :(得分:1)
这是一个常见的错误。你实际上在这里想要$elemMatch
,因为它的用途是“同一个数组上的多个条件”:
db.getCollection('test').update(
{ "friends": { "$elemMatch": { "fname": 'qiang', "lname": 'lan'} },
{ "$set":{ "friends.$.age": 50 } }
)
如果没有$elemMatch
,查询条件正在考虑“整个”数组,并且将匹配任何数组元素中的“fname”或“lname”。这就是update()
抱怨的原因。
答案 1 :(得分:0)
尝试使用和条件。
$并对两个或更多的数组执行逻辑AND运算 表达式(例如,等)并选择 满足数组中所有表达式的文档。
db.getCollection('test').update({$and:[{'friends.fname': 'qiang'}, {'friends.lname': 'lan'}], {$set:{'friends.$.age': 50}})