What is the best way to return all documents in a collection if I want document.a == document.b?
I've tried
db.collection.aggregate([ { $match: { $eq: [ '$a', '$b' ] } }])
But it returns with no errors or results, because I assume it is literally matching strings "$a" and "$b". Is there a different way to specify that these are fields?
db.collection.aggregate([    { $project: { 
    eq: { $cond: [ { $eq: [ '$a', '$b' ] }, 1, 0 ] } 
} },
{ $match: { eq: 1 } }])
The above works, but requires the additional step of querying again with whatever documents it found or projecting all possible fields.
Is there a better way for achieving this query?
                        
Basically, you are trying to perform a self join. An operation not supported by MongoDB.
Concerning the
$eqoperator, as you guessed:$eqcomparison query operator match a field against a value.$eqcomparison aggregation operator compare the value of two expressions.I don't know any other way to perform what you need than using an extra
$projectstep as you suggested.Please note this is not significantly more expensive as, anyway, your query cannot use any index and MongoDB will do a full scan.