MongoDB:用两个相同的字段$ match和$ eq查询文档
如果我想要document.a == document.b,返回集合中所有文档的最佳方法是什么?
我试过了
db.collection.aggregate([ { $match: { $eq: [ '$a', '$b' ] } }])
但它返回没有错误或结果,因为我认为它是字面上匹配string“$ a”和“$ b”。 有没有不同的方式来指定这些是字段?
db.collection.aggregate([ { $project: { eq: { $cond: [ { $eq: [ '$a', '$b' ] }, 1, 0 ] } } }, { $match: { eq: 1 } }])
以上的工作,但需要额外的步骤,再次查询它find的任何文件或投影所有可能的领域。
有没有更好的方法来实现这个查询?
基本上,你正在尝试执行自我join。 MongoDB不支持的操作。
关于$eq
运算符,正如你所猜测的那样:
- 按照devise,
$eq
比较查询操作符将一个字段与一个值进行匹配。 - 但
$eq
比较聚合运算符比较两个expression式的值。
我不知道任何其他方式来执行你所需要的,而不是像你所build议的那样使用额外的$project
。
请注意,这不是太昂贵,因为无论如何,您的查询不能使用任何索引,MongoDB将执行完整的扫描。
如果我理解你的问题,你想要那些在field1和field2中具有相同值的文档。
对于这个尝试
db.coll.find({$where: function() { return this.field1 == this.field2 } } );
或更紧凑
db.coll.find({ $where : "this.field1 == this.field2" } );