Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 Meteor:反应式本地收集(仅限客户端)正确的观测值更改_Mongodb_Meteor_Cursor - Fatal编程技术网

Mongodb Meteor:反应式本地收集(仅限客户端)正确的观测值更改

Mongodb Meteor:反应式本地收集(仅限客户端)正确的观测值更改,mongodb,meteor,cursor,Mongodb,Meteor,Cursor,我有一个包含多个数组的集合,即 memos: [...] todos: [...] 我将数组中的每个文档插入客户端上的本地集合: if (Meteor.isClient) { this.Memos = new Mongo.Collection(null); var results; results = Projects.findOne({ _id: currentProject_id }); results.memos.forEach(function(me

我有一个包含多个数组的集合,即

memos: [...]
todos: [...]
我将数组中的每个文档插入客户端上的本地集合:

if (Meteor.isClient) {

  this.Memos = new Mongo.Collection(null);

  var results;

  results = Projects.findOne({
    _id: currentProject_id
  });

  results.memos.forEach(function(memo) {
    return Memos.insert(memo);
  });
}
如果调用某个方法来更改服务器集合中的备忘录:

({
  completeMemo: function(project_id, memo_id, ifCompleted) {
    return Projects.update({
      _id: project_id,
      'memo._id': memo_id
    }, {
      $set: {
        'memos.$.completed': ifCompleted
      }
    });
  }
});
Meteor尝试将更改的文档重新插入本地集合,引发以下错误:

Exception from Tracker recompute function:
MinimongoError: Duplicate _id '43ttergerg33t3t'
我不想重新插入文档,只想反映更改

我已尝试修改
退货备忘。将(备忘)
插入到:

Memos.upsert({
  _id: memo._id
}, {
  $set: {
    direction: memo.direction,
    sender: memo.sender,
    sender_id: memo.sender_id,
    sentAt: memo.sentAt,
    text: memo.text,
    type: memo.type,
    viewed: memo.viewed
  }
});
但是,这会引发相同的错误。 更新上述操作非常有效,错误来自其他原因。见下面我的答案

我如何观察这些文档上的更改并只更新已更改的字段?

我想我需要像下面这样的东西:

Memos = new Mongo.Collection;

query = Projects.findOne({
  _id: currentProject_id
});

handle = query.memos.observeChanges({
  added: function(id, doc) {
    Memos.insert(doc);
  },

  changed: function(id, doc) {
    ..........???;
  },

  removed: function(id) {
    Memos.remove({
      _id: id
    });
  }
});
meteor尝试将更改的文档重新插入本地 收藏

这是正常的,因为您要插入到集合中,这里需要的是对实际文档的更新,请为此使用运算符

return Memos.update({_id:memo._id},{$set:{memo:memo}});
查看有关更新运算符的更多信息

解决方案:

  • 我将
    insert
    更改为
    upsert
    ,以防止meteor尝试插入具有相同
    \u id的新文档
  • Meteor不允许在客户端上替换整个文档,因此我指定了要更新的字段:

  • 谢谢@Ethaan,这让我更接近了。由于服务器通过默认的
    added
    /
    changed
    /
    removed
    观察回调自动执行插入操作,(我想)我需要编写自己的
    observeChanges
    回调,将
    insert
    行为更改为
    update
    upsert
    。我对这个问题补充了一些细节。
    results.memos.forEach(function(memo) {
      return Memos.upsert({
        _id: memo._id
      }, {
        $set: {
          direction: memo.direction,
          sender: memo.sender,
          sender_id: memo.sender_id,
          sentAt: memo.sentAt,
          text: memo.text,
          type: memo.type,
          viewed: memo.viewed
        }
      });
    });