Reputation: 505
I'm starting off with Meteor and need some help with Mongo. I have a collection of names that I'm displaying on a list and want to be able to update one variable of certain entries in the database based on other criteria. Basically what I want to do is:
For every entry where characteristic A = true and B = true, change characteristic C to be false.
So far, I've been trying to figure out how Mongo can handle a "for each" loop over the elements of the collection, and for each element check if conditions A and B hold, and then collection.update(element, {C: false}). This is proving to be a lot more problematic than I thought. I want to do something like this (using dummy variable names):
for (i = 0; i < collection.find().count(); i++){
if (collection[i].A===true && collection[i].B===true)
collection.update(collection[i], {$set: {C: false}});
};
I've been changing this base code around, but am starting to sense that I'm missing something basic about indexing/how collections work in Mongo. Can you index a collection like this (and if so, is this even the most convenient way to do what I'm trying to do?)?
Upvotes: 9
Views: 14350
Reputation: 12792
As already suggested in comments, the correct answer is:
collection.update({A: true, B: true}, {$set: {C:false}}, {multi: true});
(At least in pure MongoDB, see there).
Without multi: true
it will change only one document matching the criteria.
In Meteor it is a bit more tricky, as you are not allowed to do client-side updates other than by matching it (so no possibility for various criteria, no possibility for multi
), see http://docs.meteor.com/#update.
You can iterate over all finds, but it would be better to run such code server-side.
Upvotes: 9
Reputation: 505
Of course I figure out how to do this right after posting, and of course it's suggested in the Meteor documentation!
And, of course, it's a simple solution:
collection.update({A: true, B: true}, {$set: {C:false}});
Upvotes: 14