给出以下db
{
"type":"s",
"disp":[
{
"quantity":1,
"date":20141109
},
{
"quantity":1,
"date":20141110
},
{
"quantity":1,
"date":20141111
}
]
},
{
"type":"d",
"disp":[
{
"quantity":1,
"date":20141109
},
{
"quantity":0,
"date":20141110
},
{
"quantity":1,
"date":20141111
}
]
}
我执行查询以获得"类型"数量磨碎器,然后是0表示一组日期
db.test.find({ "$and" : [
{ "disp" : { "$elemMatch" : { "quantity" : { "$gt" : 0 }, "date" : 20141109 } } },
{ "disp" : { "$elemMatch" : { "quantity" : { "$gt" : 0 }, "date" : 20141110 } } }
] },{"type":1})
我得到的类型" s"然后我想减少1只我查询的日期的数量
我尝试了不同类型的更新查询,但我只能更改一个数量字段。
我怎么能以原子方式做到这一点? 如果不可能,您是否可以建议我构建数据以查询和自动更新特定日期的数量?
答案 0 :(得分:1)
即使多个子文档与查询匹配,您也可以在MongoDb中更新仅单个匹配的子文档。目前这是一个限制。
要更新每个日期的所有子文档,您需要触发n
更新查询以更新n
个不同匹配日期的文档。
var dates = [20141109,20141110];
dates.forEach(function(date){
db.test.update({"type":"s","disp.date":date},
{$inc:{"disp.$.quantity":1}})
})
回答你的问题:
以原子方式更新特定日期的数量
根据文档,
$ inc是单个文档中的原子操作。
建议:
一种构建我的数据以进行查询的方法
从不有两个不同的子文档,其日期与示例中描述的相同。如果你愿意的话,在同一日期更新两个不同的子文档是没有意义的。
{
"quantity":0,
"date":20141110
},
{
"quantity":1,
"date":20141110
}