如何迭代游标并为每个文档添加字段?像这样的东西似乎不起作用:
function getNewItems() {
var items = Items.find();
items.forEach(function(item) {
item.newField = true;
});
return items;
}
我希望在将Iron Router的data
函数发送到模板之前修改它们。
答案 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
包或设置正确的allow
或deny
关于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;
}