Mongodb,'$'无法使用AND术语?

时间:2017-05-23 10:03:07

标签: mongodb mongodb-query

我正在尝试使用'$'来更新列表中的某个项目。该项由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。我只想弄明白,'$'是故意这样做的,还是我错了?

谢谢!

2 个答案:

答案 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}})