MongoDB中嵌入文档子集的更新
给定以下dbMongoDB中嵌入文档子集的更新,mongodb,Mongodb,给定以下db { "type":"s", "disp":[ { "quantity":1, "date":20141109 }, { "quantity":1, "date":20141110 }, { "quantity":1, "date":2014111
{
"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
我尝试了不同类型的更新查询,但我只能更改一个数量字段
我怎样才能用原子的方式做到这一点?
如果不可能,您能否建议我如何构造要查询的数据并自动更新特定日期的数量?您可以在MongoDb中只更新一个匹配的子文档,即使多个子文档与查询匹配。目前这是一个限制 要更新每个日期的所有子文档,您需要启动
n
update查询,以更新n
不同匹配日期的文档
您需要使用和位置更新操作符
var dates = [20141109,20141110];
dates.forEach(function(date){
db.test.update({"type":"s","disp.date":date},
{$inc:{"disp.$.quantity":1}})
})
回答您的问题:
原子更新特定日期的数量
根据文件
$inc是单个文档中的原子操作
建议:
n构造要查询的数据的方法
决不在同一日期拥有两个不同的子文档,如示例所示。如果您愿意,那么在同一日期更新两个不同的子文档是没有意义的
{
"quantity":0,
"date":20141110
},
{
"quantity":1,
"date":20141110
}
我想知道,如果查询一个文档,在内存中修改它,并将其作为一个整体进行更新,是否比多次更新更好。。。顺便说一句,重复的日期是一个打字错误,我编辑了它;)如果匹配子文档的数量非常大,那么是的,最好在客户端处理。修改并更新所有子文档,否则就可以了。我遇到了并发问题。我必须避免两个查询匹配重叠的时段,因为第一个查询部分地更新单个日期。否则我必须管理回滚。。。