您基本上需要在其中包含$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
相同的數組。
您可以使用'$ setDifference'和'[]'來移除重複項。類似'distinct_movies_played_in':{'$ size':{$ setDifference:['$ acted_in.idmovies',[]]}}' – Veeram