文档里面的数组不会是$ push,$ pull和$ inc $

时间:2016-10-02 22:42:53

标签: arrays node.js mongodb

我有一个集合,每个文档的格式都是:

{
  "_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
                    });
                });
            });
        });

(所有错误均为空)

为什么对上帝的爱?我很精神!

1 个答案:

答案 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();
})