如何使用谓词最好地过滤MongoDB集合

时间:2011-10-25 08:45:21

标签: mongodb filter predicate

我们希望使用“过度指定”的find()查询来过滤MongoDB集合。例如:collection A,我们要过滤的集合,包含一组包含属性要求的文档。示例是文档a,其中包含要求{req: age:{min:20,max:30}}b,其中包含要求{req: gender:male}

我们还有一个来自d的文档collection D,其中包含以下属性:d = {age:21, gender: male}

在这种情况下,ab都应位于d符合条件的文档集中,因为d符合两者的要求。

但是,如果我们在d查询中包含所有find的属性,我们会获得db.A.find({d.age > req.age.min, d.age < req.age.max, d.gender: req.gender}),这会排除ab从我们的结果。

选择A满足d要求的所有文档的最佳方法是什么,因为d可能包含的属性多于A中文档的要求,A中的要求和D中的要求是否已修复?我们希望避免在D所有A.req文档中指定每个可能的属性,因为我们希望我们的要求尽可能灵活。

1 个答案:

答案 0 :(得分:3)

没有直接的方法可以做到这一点。您可以采取的唯一途径是对每个需求执行存在检查,这不会产生可以想象的最优雅的查询。使用您的查询格式:

db.A.find({$and:[{req.age.min:{$exists:true}}, {d.age > req.age.min}], ....)

换句话说。您修改您的查询,使其跟随“如果D的属性在A中有要求,检查它是否满足该要求”。坦率地说,我认为看一个更合适的架构可能是一条更优雅的路线。