在mongodb中更新或添加嵌套数组的数据

时间:2015-12-07 11:50:22

标签: mongodb meteor

我是mongodb的新手。我想在现有文档上更新或添加新的数组值。

我的意见是:

 {
  "_id" : "Tx8Yo3FJC7WpqNpGs",
  "sharedId" : "LnkvSu8zdaahHjQmu",
  "data" : [{
     "ownerId" : "100",
     "taskId" : 1000,
     "taskName" : "trip"
 },{
     "ownerId" : "100",
     "taskId" : 2000,
     "taskName" : "meeting"
 }]
}
  1. 如果 ownerId taskId 相同,则只需更新。
  2. 如果 ownerId taskId 不同,则添加到当前数组。
  3. 预期输出为:

    {
     "_id" : "Tx8Yo3FJC7WpqNpGs",
     "sharedId" : "LnkvSu8zdaahHjQmu",
     "data" : [{
        "ownerId" : "100",
        "taskId" : 1000,
        "taskName" : "trip"
      },{
        "ownerId" : "100",
        "taskId" : 2000,
        "taskName" : "meeting"
      },{
        "ownerId" : "100",
        "taskId" : 3000,
        "taskName" : "games"
       }
     ]
    }
    

    我试过这个,但没有成功。

    SharedTask.update({
      sharedId: sharedToIds,
      data: {
        ownerId: userId,
        taskId: taskId
      },
    }, {
      $push: {
        data: [{
          'ownerId': userId,
          'taskId': taskId,
          'taskName': taskName
        }]
      }
    }, {
      upsert: true
    });
    

2 个答案:

答案 0 :(得分:0)

利用$addToSet

$addToSet运算符向数组添加值,除非该值已经存在,在这种情况下$addToSet对该数组不执行任何操作。

SharedTask.update({
  sharedId: sharedToIds,
}, {
  $addToSet: {
    data: {
      'ownerId': userId,
      'taskId': taskId,
      'taskName': taskName
    }
  },{
       upsert: true
    }
});
  • $ push已更改为$ addToSet
  • 数据值为数组,更改为单个对象

答案 1 :(得分:0)

您无法一次更新所有文档,因为您正在通过更新和添加来维护对象数组。你可以按照以下方式逐一完成。

var _ = require('underscore');
var updated = {
ownerId : "100",
taskId : 2000,
taskName : "meeting1" };

SharedTask.findOne({
  sharedId: sharedToIds,
}, function(err, sharedTask){
    if(!err){
       var index = _.findIndex(sharedTask.data, { taskId: updated.taskId, ownerId:updated.ownerId });
    if(~index){
        sharedTask.data[index] =  updated;
     }else{
       sharedTask.data.push(updated);
       }
      sharedTask.save(function(err){
         if(!err){ console.log("Its okay"); }
      });
    }
});

您可以按上述Hiren S执行此操作。但是有一个问题,它不会更新现有的。