向流星光标添加字段

时间:2014-02-21 02:44:28

标签: javascript meteor

如何迭代游标并为每个文档添加字段?像这样的东西似乎不起作用:

function getNewItems() {
    var items = Items.find();
    items.forEach(function(item) {
        item.newField = true;
    });
    return items;
}

我希望在将Iron Router的data函数发送到模板之前修改它们。

4 个答案:

答案 0 :(得分:9)

根据您的具体要求 -

如果你想计算每个项目的值,只是为了显示目的(例如在模板中使用的字段):

Items.find({ /* selector */ }, {
   transform: function(item){
      item.newField = true;
      return item;
    }
}); 

但是,如果您想使用Meteor api更新具有不同值的每个文档(在mongodb中):

var items = Items.find({ /* selector */});
items.forEach(function(item){
   var someValue = computeSomeValue(item);
   Items.update({
     _id: item._id
   }, {
      $set: {
         newField: someValue
      }
   });
 });

否则,如果您只想使用SAME值更新每个匹配项:

Items.update({ /* selector */}, {
  $set: {
    newField: true
    },
  },
  { 
    multi: true
  }
);

如果你在Meteor中做这个客户端 - 你的成功(最后两个选项)也将取决于使用insecure包或设置正确的allowdeny关于Items集合的规则。

答案 1 :(得分:1)

如果您不需要维护游标抽象并且只能返回一个数组:

function getNewItems() {
  return Items.find().map(function(item) {
    return _.extend(item, {newField: true});
  });
}

如果你坚持维护一个游标抽象,你可以处理在本地集合上维护Items.find().observe的{​​{1}}回调(例如newField),你可以从中调用一个游标给调用者

答案 2 :(得分:0)

要更改本地MongoDB缓存中的对象,请使用MongoDB更新运算符:http://docs.mongodb.org/manual/tutorial/modify-documents/

答案 3 :(得分:0)

正如在不同的答案中所述,还有其他方法可以实现您的目标,但如果您必须使用forEach迭代光标,那么您必须知道一旦在forEach,map或fetch中手动迭代游标,它必须被重新归为per the docs州。

请参阅this answer一个非常类似的问题。

function getNewItems() {
    var items = Items.find();
    items.forEach(function(item) {
        item.newField = true;
    });

    items.rewind(); // See how I reset the cursor to its initial position here

    return items;
}