2017-10-21 11 views
0

私はコレクションを持っており、コレクション内の各ドキュメントに配列フィールドcountriesがあります。私は、以下の国のいずれかを含むすべての文書を選択します:一致する配列要素を探す方法

China, USA, Australia

、出力は各ドキュメントが持つ上記の国の数が表示されるはずです。 は、私は、集約コマンドの下に使用します。

db.movies.aggregate([ 
    { 
    $match: { countries: { $in: ["USA", 'China', 'Australia'] } } 
    }, 
    { 
    $project: { 
     countries: {$size: '$countries'} 
    } 
    } 
]); 

期待どおりに動作しません。上に挙げた国の文書のすべての国の番号が表示されます。たとえば、文書にcountriesフィールドにChina, Japanがある場合は、上記の国リストにはしか含まれていないため、1を返すと予想しましたが、2が返されます。どのようにして集約コマンドでそれを行うことができますか?

答えて

2

$inオペレータは、可能な値の1つを含むドキュメントを「照会」するだけで、アレイから何も削除しません。

あなたは「のみ一致します」カウントするようにしたい場合は、$size前に、アレイに$setIntersectionを適用します。

文書に配列に対して提供する配列に「ユニーク」の「設定」を返すと一致する
db.movies.aggregate([ 
    { 
    $match: { countries: { $in: ["USA", 'China', 'Australia'] } } 
    }, 
    { 
    $project: { 
     countries: { 
     $size: { 
     "$setIntersection": [["USA", 'China', 'Australia'], '$countries' ] 
     } 
    } 
    } 
]); 

最近のリリース(MongoDB 3.4以上)では、集計演算子として$inの代替語句があります。これは、値の配列に対して「特異」値を「テスト」する際に、少し違った働きをします。配列の比較では、$filterに適用されます:「ドキュメント内の」アレイが一意でないエントリが含まれている実際にはあなたにとって重要であるべき

db.movies.aggregate([ 
    { 
    $match: { countries: { $in: ["USA", 'China', 'Australia'] } } 
    }, 
    { 
    $project: { 
     countries: { 
     $size: { 
     $filter: { 
      input: '$countries', 
      cond: { '$in': [ '$$this', ["USA", 'China', 'Australia'] ] } 
     } 
     } 
    } 
    } 
]); 

。すなわち:

{ countries: [ "USA", "Japan", "USA" ] } 

そして、あなたは1とは対照的に、それは素晴らしい作品$setIntersection

+0

の結果を「設定」、感謝されるであろう、"USA"ため2をカウントする必要がありました。 –

関連する問題