Mongodb和#x27$';无法使用和条款?

Mongodb和#x27$';无法使用和条款?,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在尝试使用“$”更新列表中的某个项目。该项由firstName和lastName确定,在这种情况下,firstName+lastName组合是唯一的 这是我的文件 { "_id" : ObjectId("592403125ec4f65fb02e36a0"), "friends" : [ { "age" : 30.0, "fname" : "qiang", "lname" : "he" }, { "ag

我正在尝试使用“$”更新列表中的某个项目。该项由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"
    }
]
}
所以我想改变强兰的年龄,这是列表中的第三项。但他与项目0同名,与项目2同名。我使用的代码是:

db.getCollection('test').update({'friends.fname': 'qiang', 'friends.lname': 'lan'}, {$set:{'friends.$.age': 50}})
这个密码并没有改变羌兰的年龄,但它将0项羌河的年龄改为50岁,这是我的一个术语中最早的匹配项。因此,术语实际上被视为或,而不是和

我知道这可以通过添加一个全名字段来解决,该字段等于firstName+lastName,并在更新时匹配全名。我只是想弄清楚,“$”是故意这样做的,还是我用错了


谢谢

试着使用和调节

$and对两个或多个阵列执行逻辑and操作 表达式(例如,等)并选择 满足数组中所有表达式的文档


这是一个常见的错误。实际上,您需要在这里使用,因为它的预期用途是“同一数组项上的多个条件”:

db.getCollection('test')。更新(
{“朋友”:{“$elemMatch”:{“fname”:“强”,“lname”:“兰”},
{“$set”:{“friends.$.age”:50}
)
如果没有
$elemMatch
,查询条件将考虑“整个”数组,并将匹配任何数组元素中的“fname”或“lname”。这就是
更新()
抱怨。

。因此,
$和
在这里什么也没有提供,这不是它的预期用途。这里的查询本质上与OP的问题完全相同,这就是产生错误的原因。
db.getCollection('test').update({$and:[{'friends.fname': 'qiang'}, {'friends.lname': 'lan'}], {$set:{'friends.$.age': 50}})