我的actors
集合包含一个名为acted_in
的文档数组字段。我希望返回acted_in.idmovies
内的不同值的数量,而不是像{$size: $acted_in.idmovies}
那样返回$acted_in.idmovies
的大小。我怎么能这样做?
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 :(得分:2)
你基本上需要在其中包含$setDifference
以获得" distinct"项目。所有"设置"是" distinct"通过设计和获得差异"从当前数组到空数[]
,您将获得所需的结果。然后,您可以应用$size
。
你也有一些常见的错误/误解。首先,当使用$match
或任何MongoDB查询表达式时,除非有明确的情况,否则不需要使用$and
。 所有查询表达式参数都是"已经" AND条件,除非另有明确说明,与$or
一样。因此,请不要明确使用此案例。
其次,您的$project
正在为每个字段使用显式字段路径变量。您不需要这样做只是为了返回该字段,并且在"表达式#34;中使用之外,您只需使用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"
中的元素表示您至少拥有支持$addFields
的MongoDB 3.2),那么请使用它而不是指定文档中的所有其他字段。
c1 = actors.aggregate([
{ "$match": { "fname"': f_name, "lname": l_name } },
{ "$addFields": {
"distinct_movies_played_in": {
"$size": { "$setDifference": [ "$acted_in.idmovies", [] ] }
}
}}
])
除非您明确需要指定"某些"其他领域。
此处的基本案例是不要使用$unwind
进行数组操作,除非您特别需要对其执行$group
操作&# 39; s _id
键指向从""中获得的值数组。
在所有其他情况下,MongoDB具有更高效的运算符,可以处理$unwind
所做的数组。
答案 1 :(得分:1)
这可以给你你想要的东西:
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'}
}
}
])
解构tags
数组后再将其放回一组自身,然后你需要获得该项的数量或长度。