MongoDB:查询具有两个相等字段的文档,$ match和$ eq

时间:2015-06-10 17:11:49

标签: node.js mongodb npm aggregation-framework database

如果我需要document.a == document.b,那么返回集合中所有文档的最佳方法是什么?

我试过

db.collection.aggregate([ { $match: { $eq: [ '$a', '$b' ] } }])

但它返回时没有错误或结果,因为我认为它字面上匹配字符串“$ a”和“$ b”。有没有不同的方法来指定这些是字段?

db.collection.aggregate([    { $project: { 
    eq: { $cond: [ { $eq: [ '$a', '$b' ] }, 1, 0 ] } 
} },
{ $match: { eq: 1 } }])

上述工作,但需要额外的步骤,使用它找到的任何文件或预测所有可能的字段再次查询。

有没有更好的方法来实现此查询?

2 个答案:

答案 0 :(得分:8)

如果我理解你的问题,你想要那些在field1和field2中具有相同值的文档。

为此尝试

db.coll.find({$where: function() { return this.field1 == this.field2 } } );

或更紧凑

db.coll.find({ $where : "this.field1 == this.field2" } );

答案 1 :(得分:1)

基本上,您正在尝试执行自我加入。 MongoDB不支持的操作。

关于$eq运营商,正如您所猜测的那样:

我不知道如何使用您建议的额外$project步骤来执行您需要的任何其他方式。

请注意,这不是显着更昂贵,因为无论如何,您的查询无法使用任何索引,MongoDB将进行全面扫描。