Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何在更新查询中向数组添加或inc?_Mongodb - Fatal编程技术网

Mongodb 如何在更新查询中向数组添加或inc?

Mongodb 如何在更新查询中向数组添加或inc?,mongodb,Mongodb,如果我有一个文档,它有一个数组,其中包含表示一天计数的项目,可能类似于:- { data : [ {'20141102' : 2 },{'20141103' : 4 } ] } 当我进行更新时,我有一个字符串'20141103',然后是一个'20141104',我想将数组项合并或添加一个新的数组项。这是否可能通过更新实现?是的,这是可行的。我这样试过: (在mongo shell上运行;客户端和服务器都是V2.6.4) function tryAndFine(coll, key, val

如果我有一个文档,它有一个数组,其中包含表示一天计数的项目,可能类似于:-

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

当我进行更新时,我有一个字符串
'20141103'
,然后是一个
'20141104'
,我想将数组项合并或添加一个新的数组项。这是否可能通过更新实现?

是的,这是可行的。我这样试过:
(在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
    } ]
}