2011-10-25 39 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檢查中是否符合要求」。坦率地說,我認爲看一個更合適的模式可能是更優雅的路線。