我们希望使用“过度指定”的find()查询来过滤MongoDB集合。例如:collection A
,我们要过滤的集合,包含一组包含属性要求的文档。示例是文档a
,其中包含要求{req: age:{min:20,max:30}}
和b
,其中包含要求{req: gender:male}
。
我们还有一个来自d
的文档collection D
,其中包含以下属性:d = {age:21, gender: male}
。
在这种情况下,a
和b
都应位于d
符合条件的文档集中,因为d
符合两者的要求。
但是,如果我们在d
查询中包含所有find
的属性,我们会获得db.A.find({d.age > req.age.min, d.age < req.age.max, d.gender: req.gender})
,这会排除a
和b
从我们的结果。
选择A
满足d
要求的所有文档的最佳方法是什么,因为d
可能包含的属性多于A中文档的要求,A
中的要求和D
中的要求是否已修复?我们希望避免在D
所有A.req
文档中指定每个可能的属性,因为我们希望我们的要求尽可能灵活。
答案 0 :(得分:3)
没有直接的方法可以做到这一点。您可以采取的唯一途径是对每个需求执行存在检查,这不会产生可以想象的最优雅的查询。使用您的查询格式:
db.A.find({$and:[{req.age.min:{$exists:true}}, {d.age > req.age.min}], ....)
换句话说。您修改您的查询,使其跟随“如果D的属性在A中有要求,检查它是否满足该要求”。坦率地说,我认为看一个更合适的架构可能是一条更优雅的路线。