MongoDB中嵌入文档子集的更新

MongoDB中嵌入文档子集的更新,mongodb,Mongodb,给定以下db { "type":"s", "disp":[ { "quantity":1, "date":20141109 }, { "quantity":1, "date":20141110 }, { "quantity":1, "date":2014111

给定以下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

我尝试了不同类型的更新查询,但我只能更改一个数量字段

我怎样才能用原子的方式做到这一点?
如果不可能,您能否建议我如何构造要查询的数据并自动更新特定日期的数量?

您可以在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
    }

我想知道,如果查询一个文档,在内存中修改它,并将其作为一个整体进行更新,是否比多次更新更好。。。顺便说一句,重复的日期是一个打字错误,我编辑了它;)如果匹配子文档的数量非常大,那么是的,最好在客户端处理。修改并更新所有子文档,否则就可以了。我遇到了并发问题。我必须避免两个查询匹配重叠的时段,因为第一个查询部分地更新单个日期。否则我必须管理回滚。。。