2017-10-21 201 views
0

我有一個集合,該集合中的每個文檔都有一個數組字段countries。我要選擇,其中包括以下任何國家的所有文件:如何計算匹配的數組元素

China, USA, Australia

和輸出應顯示上述國家每個文檔都有數。 我使用aggregate命令如下:

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

預期這是行不通的。它顯示了文件中具有上述國家/地區的所有國家/地區的數量。例如,如果某個文檔的countries字段中有China, Japan,我預期它會返回1(因爲只有China位於上述國家/地區列表中),但返回2。我怎麼能在聚合命令中做到這一點?

回答

2

$in運算符只是「查詢」包含其中一個可能值的文檔,因此它不會從數組中刪除任何內容。

如果要算「只匹配」,那麼$size前應用$setIntersection到數組:

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

,返回的「獨一無二」的「設置」匹配文檔中提供了針對數組的數組。

$in作爲現代版本(至少是MongoDB 3.4)的聚合運算符。這在對一組值進行「測試」「單數」值時有點不同。在數組進行比較,你將適用與$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" ] } 

你需要計算2"USA",而不是1這將是「套」的$setIntersection

+0

它的偉大工程,感謝結果。 –