I would suggest you use the aggregation structure instead, since it is much faster and more understandable. Your above M / R / F can be written as easily as:
db.so.insert( { name: "Derick" } ); db.so.insert( { name: "Derick" } ); db.so.insert( { name: "Derick" } ); db.so.insert( { name: "Derick" } ); db.so.insert( { name: "Checklist" } ); db.so.insert( { name: "Checklist" } ); db.so.insert( { name: "Whoop" } ); db.so.insert( { name: "Whoop", flagged: true } ); db.so.aggregate( [ { $group: { _id: '$name', count: { $sum: 1 }, flagged: { $sum: { $cond: [ { $eq: [ '$flagged', true ] }, 1, 0 ] } } } }, { $match: { $or: [ { count: { $gt: 3 } }, { flagged: { $gt: 0 } } ] } } ] );
What returns:
{ "result" : [ { "_id" : "Whoop", "count" : 2, "flagged" : 1 }, { "_id" : "Derick", "count" : 4, "flagged" : 0 } ], "ok" : 1 }
source share