我能够减少嵌套数组中的值,但我想检查该值是否大于零(所以永远不要去负数)。例如,我有这个:
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
我认为获得我想要的正确方法是使用$
,但我不明白问题出在哪里。
答案 0 :(得分:0)
修正使用:
db.getCollection('schedulers').update(
{
"_id" : ObjectId("5a3b0bd69c0000c2a1d839af"),
"slots" :
{
"$elemMatch":
{
"id":"V2qlAEk7Wp0tWwlyWSfX7KRZ",
"number":
{
"$gt" : 0
}
}
}
},
{
"$inc":
{
"slots.$.number":-1
}
})
由于