2011-10-25 40 views
1

我们想使用“超指定”find()查询来过滤MongoDB集合。例如:我们要过滤的集合collection A具有包含一组属性需求的文档。示例是文档a,其包含要求{req: age:{min:20,max:30}}b,其包含要求{req: gender:male}如何使用谓词来最好地过滤MongoDB集合

我们也有文件,d,从collection D包含以下属性:d = {age:21, gender: male}

在这种情况下,无论是ab应在一组文档d可享有,为d满足了这两个要求。

但是,如果我们包括所有在find查询d的属性,我们得到db.A.find({d.age > req.age.min, d.age < req.age.max, d.gender: req.gender}),这将排除我们的结果都ab

什么是选择所有的文件,因为d可含有大于文件A指定要求更多的属性,最好的方式Ad满足了要求,并在A的要求和D属性不是固定的?我们希望避免在所有A.req文档中指定D中的所有可能属性,因为我们希望我们的要求尽可能灵活。

回答

3

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

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

换句话说。您可以修改您的查询,使其符合“如果D的属性在A检查中是否符合要求”。坦率地说,我认为看一个更合适的模式可能是更优雅的路线。