2016-05-22 9 views
2

これをどのようにタイトル付けするかはわかりませんでした。配列フィールドのすべての値が別の配列に存在するドキュメントを選択

だから私は、製品ID

var productIds = [139,72,73,1,6] 

とその製品のすべては、配列に表示されたときに、私は顧客を見つけるしたいのMongoDB

{ 
    name: 'James', 
    products: [ 73, 139 ], 
    _id: 5741cff3f08e992598d0a39b 
} 

{ 
    name: 'John', 
    products: [ 72, 99 ], 
    _id: 5741d047f08e992598d0a39e 
} 

における顧客書類の束の配列を持っています製品ID(productIds)

は、私が試した:

'products' : { 
    '$in': productIds 
} 

しかし、それは私も試した

製品IDのリストに存在しなくても99かかわらず、ジョン、返します。

'products' : { 
    '$all': productIds 
} 

顧客のどれもがすべての製品を持っていないので、何も返さない

私は単一のクエリで必要なものを達成する方法があるのですか、いくつかのポストクエリ処理を行う必要がありますか?

私も

'products': { 
    '$in': productIds, 
    '$not': { 
     '$nin': productIds 
    } 
} 

を試してみましたが、これはまた、必ずしもすべての製品IDはあなたが.aggregate()方法と$redact演算子を使用してこれを行うことができます

答えて

2

と一致したときに顧客を返すようです。 $cond式では、 "products"配列内のすべての要素が "productIds"にあるかどうかを確認するために$setIsSubsetを使用する必要があります。条件式に$inを使用できないためです

var productIds = [139,72,73,1,6]; 
db.customers.aggregate([ 
    { "$redact": { 
     "$cond": [ 
      { "$setIsSubset": [ "$products", productIds ] }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    }} 
]) 
関連する問題