【问题标题】:Mongodb, '$' cannot work with AND terms?Mongodb,'$' 不能与 AND 条款一起使用?
【发布时间】:2017-05-23 18:10:57
【问题描述】:

我正在尝试使用“$”来更新列表中的某个项目。项目由 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"
    }
]
}

所以我正在尝试更改强兰的年龄,也就是列表中的第 3 项。但他的名字与项目 0 相同,姓氏与项目 2 相同。我使用的代码是:

db.getCollection('test').update({'friends.fname': 'qiang', 'friends.lname': 'lan'}, {$set:{'friends.$.age': 50}})

这段代码并没有改变强澜的年龄,而是将0强河的年龄改为50岁,这是我的一个术语中最早的匹配。所以这些术语实际上被视为 OR,而不是 AND。

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

谢谢!

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

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

    db.getCollection('test').update(
        { "friends": { "$elemMatch": { "fname": 'qiang', "lname": 'lan'} },
        { "$set":{ "friends.$.age": 50 } }
    )
    

    如果没有$elemMatch,查询条件将考虑“整个”数组,并将匹配any 数组元素中的“fname”或“lname”。这就是update() 抱怨的原因。

    【讨论】:

      【解决方案2】:

      尝试使用和条件。

      $and 对两个或多个数组执行逻辑与运算 表达式(例如 、 等)并选择 满足数组中所有表达式的文档。

      db.getCollection('test').update({$and:[{'friends.fname': 'qiang'}, {'friends.lname': 'lan'}], {$set:{'friends.$.age': 50}})
      

      【讨论】:

      猜你喜欢
      • 2015-10-01
      • 2014-07-28
      • 1970-01-01
      • 2021-08-23
      • 2013-12-12
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多