Javascript 观察嵌套数组的更改';t添加/更改返回元素

Javascript 观察嵌套数组的更改';t添加/更改返回元素,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我在此光标上使用了一个observeChanges,如下所示。游标包含一个名为“messages”的嵌套数组 但是,这会生成所有消息,而不是更改或添加的消息。你怎么能把最后一个推过来?获取最后一个将无法按预期工作,因为您可以一次推送多个 在第一步中,您必须禁用observeChanges以仅捕获新事物: var init = true; Connections.find({ status: 'connected' }).observeChanges({ added: function (

我在此光标上使用了一个
observeChanges
,如下所示。游标包含一个名为“messages”的嵌套数组

但是,这会生成所有消息,而不是更改或添加的消息。你怎么能把最后一个推过来?获取最后一个将无法按预期工作,因为您可以一次推送多个


在第一步中,您必须禁用observeChanges以仅捕获新事物:

var init = true;
Connections.find({
  status: 'connected'
}).observeChanges({
  added: function (id) {
    if(init) return;
    console.log(`Connected ${id}`);
  },
  changed: function (id, fields) {
    if(init) return;
    // I expect fields to be the last array item pushed
    console.log(fields['messages']);
  }
});
init = false;
以下是Meteopad版本:


我找到了一种方法,它不是使用
observeChanges
,而是使用
observes

Connections.find({
  status: 'connected'
}).observe({
  changed: function (newDoc, oldDoc) {
    let newMessages = _.clone(newDoc.messages);
    let old = _.clone(oldDoc.messages);
    while (JSON.stringify(old) !== JSON.stringify(newMessages.slice(0, old.length))) {
      old.shift();
    }
    let last = newMessages.slice(old.length);
  }
});

我添加了一个示例。我不相信这是有意为之的我改变了答案,它应该做你想做的:)只是想知道在你的收藏规模增加的同时,你是否有性能问题。
Connections.find({
  status: 'connected'
}).observe({
  changed: function (newDoc, oldDoc) {
    let newMessages = _.clone(newDoc.messages);
    let old = _.clone(oldDoc.messages);
    while (JSON.stringify(old) !== JSON.stringify(newMessages.slice(0, old.length))) {
      old.shift();
    }
    let last = newMessages.slice(old.length);
  }
});