I would suggest you use the aggregation framework instead as it's much faster and easier to understand. 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 } } ] } }
] );
Which returns:
{
"result" : [
{
"_id" : "Whoop",
"count" : 2,
"flagged" : 1
},
{
"_id" : "Derick",
"count" : 4,
"flagged" : 0
}
],
"ok" : 1
}