2011-10-25 4 views
1

"overspecified" find()クエリを使用してMongoDBコレクションをフィルタリングしたいとします。たとえば、フィルタリングするコレクションのcollection Aには、属性の要件のセットを含むドキュメントがあります。例は{req: age:{min:20,max:30}}bという要件を含む文書aで、要件は{req: gender:male}です。述部を使用してMongoDBコレクションを最適にフィルタリングする方法

dcollection Dからは、d = {age:21, gender: male}という内容の文書もあります。 dは、両方の要件を満たしているとして、この場合

、両方 abは、 dが対象である文書の集合である必要があります。我々は findクエリで dの属性のすべてが含まれている場合

しかし、我々は我々の結果から、両方abを排除するdb.A.find({d.age > req.age.min, d.age < req.age.max, d.gender: req.gender})を取得します。

dが指定における文書の要件より多くの属性が含まれており、DAと属性の要求事項ということを考えると、dが要件を満たしていることA内のすべての文書を選択するための最良の方法は何ですか修正されていないのですか?すべてのA.req文書で、可能なすべての属性をDに指定することは避けたいと考えており、要件をできるだけ柔軟にしたいと考えています。

答えて

3

これを行う簡単な方法はありません。あなたが取ることができる唯一のルートは、最も洗練されたクエリが想像を絶する結果にならない各要件の存在チェックを実行することです。クエリフォーマットの使用:

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

つまり、あなたは "Dの属性がその要件を満たしているかどうかチェックする"という要件を持っているならばそれに従うようにあなたのクエリを変更します。率直に言って私はより適切なスキーマを見てもよりエレガントなルートかもしれないと思う。

関連する問題