2017-06-16 34 views
2

我的actors集合包含一個名爲acted_in的文檔數組字段。而不是像acted_in.idmovies那樣返回大小:{$size: $acted_in.idmovies},我想返回$acted_in.idmovies中不同值的數量。我怎樣才能做到這一點 ?MongoDB統計數組中的不同項目

c1 = actors.aggregate([{"$match": {'$and': [{'fname': f_name}, 
              {'lname': l_name}]}}, 
         {"$project": {'first_name': '$fname', 
            'last_name': '$lname', 
            'gender': '$gender', 
            'distinct_movies_played_in': {'$size': '$acted_in.idmovies'}}}]) 
+0

您可以使用'$ setDifference'和'[]'來移除重複項。類似'distinct_movies_played_in':{'$ size':{$ setDifference:['$ acted_in.idmovies',[]]}}' – Veeram

回答

1

這應該給你你想要的一切:tags陣列被解構,然後放回了一套自身

actors.aggregate([ 
    { 
     $match: {fname: f_name, lname: l_name} 
    }, 
    { 
     $unwind: '$tags' 
    }, 
    { 
     $group: { 
        _id: '$_id', 
        first_name: {$first: '$fname'}, 
        last_name: {$last: '$lname'}, 
        gender: {$first: '$gender'}, 
        tags: {$addToSet: '$tags'} 
       } 
    }, 
    { 
     $project: { 
         first_name: 1, 
         last_name: 1, 
         gender: 1, 
         distinct: {$size: '$tags'} 
        } 
    } 
]) 

後,那麼你只需要獲得項目或長度的數量那套。

2

您基本上需要在其中包含$setDifference以獲取「不同」項目。所有的「集合」在設計上都是「獨特的」,通過獲得從當前數組到「空白」的「差異」[],您會得到期望的結果。然後你可以申請$size

你也有一些常見的錯誤/誤解。首先,在使用$match或任何MongoDB查詢表達式時,不需要使用$and,除非有明確的情況。 全部查詢表達式參數是「已經」AND條件除非另有明確規定,如$or。所以不要明確地使用這種情況。

其次,您的$project正在爲每個字段使用顯式字段路徑變量。你並不需要做的,只是重返現場,和使用之外的「表達」,你可以簡單地用一個1譜寫你想讓它包括:

c1 = actors.aggregate([ 
{ "$match": { "fname"': f_name, "lname": l_name } }, 
{ "$project": { 
    "first_name": 1, 
    "last_name": 1, 
    "gender": 1, 
    "distinct_movies_played_in": { 
    "$size": { "$setDifference": [ "$acted_in.idmovies", [] ] } 
    } 
    }} 
]) 

事實上,如果你實際上是使用MongoDB 3.4或更高版本(以及您的數組中的元素表示"$acted_in.idmovies"表示您至少具有MongoDB 3.2),它支持$addFields,然後使用它來代替指定文檔中的所有其他字段。

c1 = actors.aggregate([ 
{ "$match": { "fname"': f_name, "lname": l_name } }, 
{ "$addFields": { 
    "distinct_movies_played_in": { 
    "$size": { "$setDifference": [ "$acted_in.idmovies", [] ] } 
    } 
    }} 
]) 

除非你明確需要指定「some」其他字段。

的基本情況在這裏不使用$unwind數組操作,除非您特別需要就與它的在陣「內」,從獲得的值_id鍵指向執行$group操作。

在所有其他情況下,MongoDB具有效率更高的運算符來處理與$unwind相同的數組。

+0

關於'$ unwind'運算符效率低下的有用見解。你的解決方案確實比我的效率更高! –