我有一个集合,每个文档的格式都是:
{
"_id": "57e81e0d5891000c99cc133b",
"name": "service_name",
"use": 8,
"errors": [],
}
errors
可能包含以下对象:
{
"e": {
"error": "socket hang up"
},
"d": "2016-10-02T18:14:27.040Z",
"n":1
},
{
"e": {
"error": "no data"
},
"d": "2016-10-02T18:22:15.257Z",
"n":2
},
{
"e": {
"error": "because derp"
},
"d": "2016-10-02T19:55:09.588Z",
"n":3
}
我想尝试基于Web的服务,当服务产生错误时,我将其与n=0
一起保存,增加use
(我调用该服务的次数)然后迭代通过所有错误递增errors.n+=1
。如果有任何错误.n> 100删除它!
最初我尝试将两个查询合并为一个(同一文档数组上的$ pull和$ push将产生错误无法同时更新'field1'和'field1')
然后我尝试了:
var error='something went boom';
db.collection('quota').update({name:'service'},{$pull:{errors:{$gt:{['errors.n']:100}}}},function(e,r){
db.collection('quota').update(
{name:'service'},
{$inc:{use:1}},
{$push:{errors:{e:error,n:0}}},
function(e,r){'done';});
只有use
上的公司发生了(从我记得我有时会推出一个错误项目,但行为完全不稳定且$拉不会发生)
所以我将所有命令分开,但仍然只包含use happens
db.collection('quota').update({name:'service'},{$pull:{errors:{$gt:{['errors.n']:100}}}},function(e,r){
console.dir([1,e]);
db.collection('quota').update({name:'service'},{$inc:{use:1}},function(e,r){
console.dir([2,e]);
db.collection('quota').update({name:'service'},{$push:{errors:{e:d.error,n:0,x:'x'}}},function(e,r){
console.dir([3,e]);
db.collection('quota').update({'errors.x':'x'},{$inc:{'errors.$.n':1}},function(e,r){
console.dir([4,e]);
//done
});
});
});
});
(所有错误均为空)
为什么对上帝的爱?我很精神!
答案 0 :(得分:1)
尝试以下:
var error='something went boom';
db.collection('quota').update({name:'service'},{$pull:{'errors':{n : {$gt: 100}}}},function(e,r){
db.collection('quota').update(
{name:'service'},
{$push:{errors:{e:error,n:0}}, $inc:{use:1}},
function(e,r){'done';});
你传递$ push作为选项的第三个参数。
<强>替代:强>
db.collection('quota').update({name:'service'},{$pull:{'errors':{n : {$gt: 100}}}},{new: true},function(e,r){
if(e) return next(e);
r.errors.push({e:error,n:0});
r.save();
})