Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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中嵌套数组上的数据_Mongodb_Meteor - Fatal编程技术网

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

更新或添加mongodb中嵌套数组上的数据,mongodb,meteor,Mongodb,Meteor,我是mongodb的新手。我想在现有文档上更新或添加新数组值 我的意见是: { "_id" : "Tx8Yo3FJC7WpqNpGs", "sharedId" : "LnkvSu8zdaahHjQmu", "data" : [{ "ownerId" : "100", "taskId" : 1000, "taskName" : "trip" },{ "ownerId" : "100", "taskId" : 2000, "

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

我的意见是:

 {
  "_id" : "Tx8Yo3FJC7WpqNpGs",
  "sharedId" : "LnkvSu8zdaahHjQmu",
  "data" : [{
     "ownerId" : "100",
     "taskId" : 1000,
     "taskName" : "trip"
 },{
     "ownerId" : "100",
     "taskId" : 2000,
     "taskName" : "meeting"
 }]
}
  • 如果所有者ID任务ID相同,只需更新即可
  • 如果所有者ID任务ID不同,则添加到当前数组
  • 预期产出为:

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

    使用
    $addToSet

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

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

    您不能一次更新所有文档,因为您正在维护通过更新和添加设置的对象数组。您可以按如下方式逐个执行此操作

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

    您可以如上所述执行此操作。但有一个问题是,它不会更新现有版本。

    您能举个例子吗。实际上,我使用$addToSet代替$set,但给出错误不起作用。它给出的错误为errro:MinimongoError:无法将$addToSet修饰符应用于非数组。抱歉,我忘记更新匹配查询。仅与sharedIdIt相比,在更新现有taskName更新的情况下,它将不起作用