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