1

ドキュメントのコレクションがあり、各ドキュメントは次のようになります。

{'name' : 'John', 'locations' : 
   [
     {'place' : 'Paris',  'been' : true}
     {'place' : 'Moscow', 'been' : false}
     {'place' : 'Berlin', 'been' : true}
   ]
}

場所配列の長さは任意です。

配列been内のすべての要素に対してフィールドが true であるドキュメントを照合したいと考えています。ドキュメントを見ると、$andを使用する必要があるように見えますが、サブフィールドで機能するかどうかはわかりません。locations

4

2 に答える 2

2

いくつかのオプションがあります:

  • $ neを使用します:db.destinations.find({"locations.been":{$ne:false}})
  • ドキュメントを保存する前に、その値を事前に計算するようにビジネスロジックを変更します。それ以外の場合、この検索で​​はすべてのレコードを調べてから、すべての場所を調べる必要があります。この値にはインデックスを付けることができます。
  • $ where演算子を使用しますが、パフォーマンスへの影響を理解してください。全表スキャンが必要になる場合があります。この場合、そうなります。
  • フィルタロジックを使用してmap-reduce関数を記述し、有効なものだけを出力します。ドキュメントごとに段階的に更新する必要があります。
  • 集約フレームワークを使用してクエリを記述します。ここには良い例がたくさんあります。ただし、他のソリューションと同様に、これはコレクション全体をループする可能性があります。
于 2013-02-10T12:53:55.500 に答える
0

$elemMatchまたはのような標準のMongoDB演算子を使用することは不可能だと思います$all。唯一可能な方法は、カスタムJSクエリを作成することです。

db.test.find("return this.locations.every(function(loc){return loc.been});")
于 2013-02-10T11:59:29.523 に答える