2016-10-05 10 views
0

私は与えられた配列A = [5, 15, 25, 35]を持っています。配列で検索する

私はコレクションCを持っています。すべてのドキュメントには、数値の配列で可変長のフィールド 'numbers'があります。

「数字」の要素として、Aの4つの要素のうち少なくとも2つの要素を持つすべての文書に一致させたいと思います。どのように効率的に進めるべきですか?

findを使用して、集約する必要はありません。

ありがとうございます。

答えて

0

aggregationと簡単です。あなたが$setIntersection$sizeを使用する必要があり、その後、少なくとも交差配列内の2つの数値要素を持つすべての文書を一致:find

db.C.aggregate([ 
    { 
     $project: { 
      numbers: 1, 
      intersectedNumbers: { 
       $size: { 
        $setIntersection: ['$numbers', [5,15,25,35]] 
       } 
      } 
     } 
    }, 
    { 
     $match: { 
      'intersectedNumbers': { 
       $gte: 2 
      } 
     } 
    } 
]) 

を使用すると、上記のaggregationのように2つの段階を必要とするので、それがより問題だし、そうではありませんfindで可能です。 しかし、あなたが行うことができ、A配列が動的である場合、「少なくとも2」のすべての要素possibiltesを返し、その後、findを使用する$or$allを使用する関数を作成することです:

db.C.find({ 
    $or: [ 
     {numbers: {$all: [5,15]}}, 
     {numbers: {$all: [5,25]}}, 
     {numbers: {$all: [5,35]}}, 
     {numbers: {$all: [15,25]}}, 
     {numbers: {$all: [15,35]}}, 
     {numbers: {$all: [25,35]}} 
    ] 
})