2012-12-24 85 views
9

我从Meteor开始,需要Mongo的帮助。我有一组名称,我在列表中显示,希望能够根据其他条件更新数据库中某些条目的一个变量。基本上我想要做的是:Meteor/Mongo:查找并更新集合中的某些元素

对于特征A = true且B = true的每个条目,将特征C更改为false。

到目前为止,我一直在试图弄清楚Mongo如何处理集合元素上的“for each”循环,并且每个元素检查条件A和B是否成立,然后是collection.update(元素,{C:false})。这证明比我想象的要困难得多。我想要做这样的事情(使用哑变量名):

for (i = 0; i < collection.find().count(); i++){ 
    if (collection[i].A===true && collection[i].B===true) 
     collection.update(collection[i], {$set: {C: false}}); 
}; 

我一直在围绕改变这个基本代码,但我开始感觉到我失去了一些东西基本在索引/如何收集工作蒙戈。你能索引一个这样的集合吗(如果是这样的话,这是甚至是最简单的方法来做我想做的事情?)?

回答

14

当然我知道如何在发布后立即做到这一点,当然这也是Meteor文档中的建议!

,当然,这是一个简单的解决方案:

collection.update({A: true, B: true}, {$set: {C:false}}); 
+2

您可以接受您自己的答案:-) – Rahul

+1

只适用于匹配选择器的第一个文档。你需要。 collection.update({A:true,B:true},{$ set:{C:false}},0,1);为所有行。 –

+2

@DavidWihl编辑多行,您需要将{multi:true}设置为第三个参数而不是0,1(请参阅流星文档,http://docs.meteor.com/#update)。所以这将是:collection.update({A:true,B:true},{$ set:{C:false}},{multi:true}) –

9

正如已经在意见提出,正确的答案是:

collection.update({A: true, B: true}, {$set: {C:false}}, {multi: true}); 

(至少在纯MongoDB中,see there)。

没有multi: true它只会更改符合条件的一个文档。

在Meteor中,它有点棘手,因为除了匹配它之外,您不允许进行客户端更新(因此不可能有各种标准,因此不可能为multi),请参阅http://docs.meteor.com/#update

可以遍历所有发现,但它会更好地运行这样的代码服务器端。

+0

'multi:true'现在也受Meteor支持:http://docs.meteor.com/#/full/update –

相关问题