您基本上需要在其中包含$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