使用Collection.update()的cursor.observe({added})打破Meteor - 为什么?

时间:2013-04-12 12:17:33

标签: meteor

我正在尝试使用cursor.observe({added})根据插入的字段计算新字段。如果在Docs.update()上观察,则使用added添加的文档中断,Meteor似乎会在内爆之前停止循环。但是,changed上的更新有效。

为什么呢?我将如何计算插入时的新字段?

见评论:

Meteor.startup(function () {
  var cursor = Docs.find();
  var handle = cursor.observe({
    added: function (doc) {
      // This breaks Meteor. Meteor gets stuck in a loop and breaks.
      Docs.update(
        doc._id,
        {$set: {metric: getCalculatedMetric( doc.x, doc.y )}}
      );
      // However, this would log once as expected.
      // console.log(doc.name + ' has been added.');
    },

    changed: function (doc, oldDoc) {
      // This works as expected, updates myField.
      Docs.update(
        doc._id,
        {$set: {metric: getCalculatedMetric( doc.x, doc.y )}}
      );
    }
  });
});

1 个答案:

答案 0 :(得分:1)

不确定为什么这会是一个问题,但我有一些非常类似于使用方法的工作

CollectionName.find({}).observe({
        added: function(document){
            Meteor.call('doSomething', {
                id: document._id
            });
        },
        changed: function(newDocument, oldDocument){
            Meteor.call('doSomething', {
                id: newDocument._id
            });
        }
});

如果这对你有用,那么删除重复的计算代码会带来额外的好处

我的方法确实使用了更细粒度的查询,但这不是问题

doSomething : function(data) {
        if(!data.id)
            throw new Meteor.Error(500, "Missing id!");
        CollectionName.update({_id:data.id}, {$set: {
            'field':value
        }});
},