【问题标题】:Update key value where different key equals some value更新不同键等于某个值的键值
【发布时间】:2015-09-25 05:41:57
【问题描述】:

我在 db test 中有许多具有以下结构的文档(由唯一的 toolname 提供):

    {
        "_id" : ObjectId("111111111111"),
        "toolname" : "hammer",
        "abilities" : [ 
            {
                "foo" : "blue",
                "bar" : "beagle",
                "LOE" : 0.65
            }, 
            {
                "foo" : "red",
                "bar" : "beagle",
                "LOE" : 0.57
            }, 
            {
                "foo" : "red",
                "bar" : "fish",
                "LOE" : 0.42
            }
        ]
    }

我可以通过以下查询find此文档:

db.test.find({"abilities.bar":"beagle","abilities.foo":"red"})

我想做的是更新LOE,我在上面的find 查询中设置的两个参数匹配。例如 - 在 "abilities.bar":"beagle""abilities.foo":"red" 的情况下,将该对象中的 "LOE" 更新为 .99

Mongo 是否有一个内置函数,您可以在其中设置一个键的值,仅当该对象中的另一个键等于某个值时?还是我需要创建一个客户端函数来返回数组索引和update 基于它?示例:

some function(){...}

db.test.update({"abilities.bar":"beagle","abilities.foo":"red"}
{ $set: { "abilities[x].LOE" : .99 } }
)

【问题讨论】:

    标签: javascript mongodb


    【解决方案1】:

    如下使用$elemMatch

    db.collection.update({"abilities":{"$elemMatch":{"bar":"beagle","foo":"red"}}},
                         {"$set":{"abilities.$.LOE":0.99}})
    

    【讨论】:

    • 如果我有“子”能力,而这就是我的 LOE 存在的地方怎么办?例如:{"foo" : "red", "bar" : "beagle", "sub": [{"subability" : "shark", "LOE" : 0.61},{"subability" : "cow", "LOE" : 0.43}]} 并且我想更新满足初始条件的位置,但我想更新 subability"shark" 的对象中的 LOE...?
    • 所以你的文档结构看起来像abilities[{"foo" : "red", "bar" : "beagle", "sub": [{"subability" : "shark", "LOE" : 0.61},{"subability" : "cow", "LOE" : 0.43}]}] 对吧?
    • 是的,如果您使用的abilities 指的是集合名称而不是文档固有的东西。
    • 两级嵌套更新有问题check this 或者您手动设置位置like this。如果你想更新,那么使用一些编程语言或脚本来更新。
    • 哇,四年了,仍然没有修复。猜猜我必须创建一个脚本。很高兴知道,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2020-06-28
    • 1970-01-01
    • 2013-07-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多