首页 文章

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

提问于
浏览
1

如果我有一个doc,其中包含一个表示一天计数的项目的数组,可能是这样的:

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

当我做一个更新,我有一个字符串 '20141103' 然后一个 '20141104' 我想要包含数组条目或添加一个新的数组条目 . 这是否可以通过更新?

1 回答

  • 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
        } ]
    }
    

相关问题