9

それぞれフィールドを持つ一連のドキュメントを挿入するとしarrayます。arrayフィールドがクエリ配列のサブセットであるようなすべてのドキュメントを検索したいと思います。たとえば、次のドキュメントがある場合、

collection.insert([
  {
     'name': 'one',
     'array': ['a', 'b', 'c']
  },
  {
     'name': 'two',
     'array': ['b', 'c', 'd']
  },
  {
     'name': 'three',
     'array': ['b', 'c']
  }
])

をクエリすると、とが両方とも のサブセットであると がcollection.find({'array': {'$superset': ['a', 'b', 'c']})表示されることが期待されます。言い換えれば、Mongo のクエリの逆を実行したいと考えています。これは、クエリ配列がドキュメントのフィールドのサブセットになるようにすべてのドキュメントを選択します。これは可能ですか?もしそうなら、どのように?onethree['a', 'b', 'c']['b', 'c']['a', 'b', 'c']$allarray

4

3 に答える 3

11

MongoDb では、配列フィールドの場合:

"$in:[...]" means "intersection" or "any element in",
"$all:[...]" means "subset" or "contain",
"$elemMatch:{...}" means "any element match"
"$not:{$elemMatch:{$nin:[...]}}" means "superset" or "in"
于 2014-03-27T03:10:44.167 に答える
10

集計フレームワークまたは検索クエリを使用してこれを行う簡単な方法があります。

検索クエリは単純ですが、 $elemMatch 演算子を使用する必要があります。

> db.collection.find({array:{$not:{$elemMatch:{$nin:['a','b','c']}}}}, {_id:0,name:1})

これは、(同時に) 'a'、'b'、または 'c' と等しくない要素を持つ配列と一致させたくないことを示していることに注意してください。オプションの結果ドキュメントの名前フィールドのみを返すプロジェクションを追加しました。

于 2013-04-19T19:04:16.540 に答える
4

集計のコンテキスト内でこれを行うには、次を使用できます$setIsSubset

db.collection.aggregate([
    // Project the original doc and a new field that indicates if array
    // is a subset of ['a', 'b', 'c']
    {$project: {
        doc: '$$ROOT',
        isSubset: {$setIsSubset: ['$array', ['a', 'b', 'c']]}
    }},
    // Filter on isSubset
    {$match: {isSubset: true}},
    // Project just the original docs
    {$project: {_id: 0, doc: 1}}
])

$setIsSubsetMongoDB 2.6 で追加されたことに注意してください。

于 2015-06-16T17:55:05.093 に答える