1. ホーム
  2. mongodb

MongoDB で、特定のフィールド値を持つドキュメントを含まない配列でドキュメントを検索する

2023-09-13 11:49:09

質問

私は、特定のフィールド値を持つ少なくとも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 } } } })

UPDATEです。 上のクエリは実際に動作します。何度も起こることですが、私のコードではなく、私のデータが間違っていたのです。

また、私は $nin 演算子 の例も見ましたが、これは配列にプリミティブな値のリストが含まれている場合のみで、 追加のドキュメントを含んでいるわけではありません。 以下のようなものでこれを実行しようとすると、私が欲しい foo フィールドだけでなく、EXACT ドキュメントを探します。

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

基本的な演算子でこれを実現する方法はないのでしょうか?

どのように解決するのですか?

使用方法 $nin を使用するとうまくいきますが、構文が正しくありません。 それはそうあるべきです。

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