如何在更新查询中添加或包含数组?

时间:2014-11-03 10:23:30

标签: mongodb

如果我有一个doc,其数组包含代表一天计数的项目,可能就像: -

{
  data : [  {'20141102' : 2 },{'20141103' : 4 } ]
}

当我进行更新时,我有一个字符串'20141103',然后是'20141104'我想要包含数组条目或添加一个新的数组条目。这可能是更新吗?

1 个答案:

答案 0 :(得分:3)

是的,这很可行。我试过这样:
(在mongo shell上运行;客户端和服务器都是V2.6.4)

function tryAndFine(coll, key, value) {
    var entry = {};
    entry[key] = value;

    var parent = 'data';
    var prefix = parent + '.';

    function incrementOnly() {
        var criteria = {};
        criteria[prefix + key] = {$exists : true};

        var update = {};
        update[prefix + "$." + key] = value;

        var result = coll.update(criteria, {$inc : update});
        // if increment fails, try to add a new one
        if (result.nModified == 0) {
            addNewElement();
        }
    }

    function addNewElement() {
        var criteria = {};
        criteria[prefix + key] = {$exists : false};

        var update = {};
        update[parent] = entry;

        var result = coll.update(criteria, {$push : update}, {upsert : true});
        // if exists, try to increment the count
        if (result.upserted == 0 && result.nModified == 0) {
            incrementOnly();
        }
    }

    // run entry
    incrementOnly();
}

// test
var c = db.c;
c.drop();
tryAndFine(c, '20141103', 1);
tryAndFine(c, '20141103', 1);
tryAndFine(c, '20141104', 1);
tryAndFine(c, '20141105', 1);
tryAndFine(c, '20141104', 1);

// output
{
    "_id" : ObjectId("54577e1a3502852bd4ad2395"),
    "data" : [ {
        "20141103" : 2
    }, {
        "20141104" : 2
    }, {
        "20141105" : 1
    } ]
}