76

特定のフィールド値を持つドキュメントが 1 つも含まれていないすべてのドキュメントを検索しようとしています。たとえば、サンプル コレクションは次のとおりです。

{  _id : 1,
  docs : [
        { foo : 1,
          bar : 2},
        { foo : 3,
          bar : 3}
         ]
},
{  _id : 2,
  docs : [
        { foo : 2,
          bar : 2},
        { foo : 3,
          bar : 3}
         ]
}

docs ブロック内に foo = 1 のレコードが 1 つも含まれていないドキュメントがないすべてのレコードを検索したいと考えています。上記の例では、2 番目のドキュメントのみが返されます。

私は次のことを試しましたが、一致しないものがあるかどうかだけを教えてくれます (ドキュメント 1.

db.collection.find({"docs": { $not: {$elemMatch: {foo: 1 } } } })

更新:上記のクエリは実際に機能します。多くの場合、コードではなく、データが間違っていました。

$nin 演算子も調べましたが、例は、追加のドキュメントではなく、プリミティブ値のリストが配列に含まれている場合のみを示しています。次のような方法でこれを実行しようとすると、必要な foo フィールドだけでなく、EXACT ドキュメントが検索されます。

db.collection.find({"docs": { $nin: {'foo':1 } } })

基本的な演算子でこれを達成する方法はありますか?

4

2 に答える 2

81

を使用して$ninも機能しますが、構文が間違っています。そのはず:

db.collection.find({'docs.foo': {$nin: [1]}})
于 2013-04-25T18:22:49.440 に答える
43

$ne次の演算子を使用します。

db.collection.find({'docs.foo': {$ne: 1}})

更新:$ninこの場合は使用しないことをお勧めします。

{'docs.foo': {$ne: 1}}のすべての要素を取り、それらのそれぞれについて、フィールドが 1 に等しいdocsかどうかをチェックします。foo一致が見つかった場合は、結果リストからドキュメントを破棄します。

{'docs.foo': {$nin: [1]}}のすべての要素を取り、要素docsごとに、そのfooフィールドが配列のいずれかのメンバーと一致するかどうかをチェックします[1]。これはデカルト積です。配列を別の配列と比較し、各要素を各要素と比較します。$ninMongoDB はスマートでこのクエリを最適化するかもしれませんが、「配列と関係がある」という理由だけで使用すると仮定します。しかし、ここで何をするかを理解すれば、それ$ninが不必要であり、パフォーマンスが劣っていることに気付くでしょう。

于 2016-07-31T13:53:53.000 に答える