更新MongoDB中嵌入文档的子集

时间:2014-11-25 15:35:16

标签: mongodb

给出以下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只我查询的日期的数量

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

我怎么能以原子方式做到这一点? 如果不可能,您是否可以建议我构建数据以查询和自动更新特定日期的数量?

1 个答案:

答案 0 :(得分:1)

即使多个子文档与查询匹配,您也可以在MongoDb中更新单个匹配的子文档。目前这是一个限制。

要更新每个日期的所有子文档,您需要触发n更新查询以更新n个不同匹配日期的文档。

您需要使用$inc和位置更新$运算符。

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
    }