MongoDB:如何在检查大于零后更新嵌套数组值?

时间:2017-12-21 03:08:34

标签: mongodb

我能够减少嵌套数组中的值,但我想检查该值是否大于零(所以永远不要去负数)。例如,我有这个:

SELECT DATEADD(DAY,3,GETDATE())

如果我想降低{ "_id" : ObjectId("5a3b0bd69c0000c2a1d839af"), "slots" : [ { "id" : "V2qlAEk7Wp0tWwlyWSfX7KRZ", "number" : 5.0 }, ....... ....... { "id" : "VfB4f8G1KcgRA8qx0aby5nI0", "number" : 0.0 }] } { "_id" : ObjectId("5a3b0bd69c0000c2a1d839ag"), "slots" : [ { "id" : "V2qlAEEESbrEB4bwberbResbd", "number" : 10.0 }, ....... ....... { "id" : "DFwseEb5enRbfsbre54rtFfds", "number" : 1.0 }] } 的第一个文档number的{​​{1}}值,我会使用:

[id=5a3b0bd69c0000c2a1d839af]

但我不知道如何在降低值之前检查slots.id = V2qlAEk7Wp0tWwlyWSfX7KRZ是否大于0。我尝试使用过滤后的位置运算符db.getCollection('schedulers').update( { "_id" : ObjectId("5a3b0bd69c0000c2a1d839af"), "slots.id" :"V2qlAEk7Wp0tWwlyWSfX7KRZ" }, { "$inc":{"slots.$.number":-1} }) ,但我有一个错误:

number

错误是:

不能使用部分(插槽的插槽。$ [elm] .number)来遍历元素....

此外,在查询的第一部分中应用条件并不能解决问题,导致mongo遍历所有数组,因此如果$[<identifier>]为零,它只是移动到另一个元素中数组直到找到数字&gt; 0,当它找到它时,它开始减少另一个元素的db.getCollection('schedulers').update( { "_id" : ObjectId("5a3b0bd69c0000c2a1d839af"), "slots.id" :"V2qlAEk7Wp0tWwlyWSfX7KRZ" }, { "$inc":{"slots.$[elm].number":-1} }, { arrayFilters: [ { "elm.number": {"$gt" : 0}} ] }) 值,完全忽略两个id条件[因为现在number然后指向数组的另一个元素]:

number

我认为获得我想要的正确方法是使用$,但我不明白问题出在哪里。

1 个答案:

答案 0 :(得分:0)

修正使用:

db.getCollection('schedulers').update(
{
    "_id" : ObjectId("5a3b0bd69c0000c2a1d839af"),
    "slots" :
    {
        "$elemMatch":
        {
            "id":"V2qlAEk7Wp0tWwlyWSfX7KRZ", 
            "number":
            {
                "$gt" : 0
            }
        }
    }
},
{
   "$inc":
   {
       "slots.$.number":-1 
   }
})

由于