Python MongoDB对数组中的不同项进行计数
我的Python MongoDB对数组中的不同项进行计数,python,mongodb,pymongo,Python,Mongodb,Pymongo,我的actors集合包含一个文档字段数组,称为acted\u in。我想返回$acted\u in.idmovies中不同值的数量,而不是像这样返回{$size:$acted\u in.idmovies}。我该怎么做 c1 = actors.aggregate([{"$match": {'$and': [{'fname': f_name}, {'lname': l_name}]}},
actors
集合包含一个文档字段数组,称为acted\u in
。我想返回$acted\u in.idmovies
中不同值的数量,而不是像这样返回{$size:$acted\u 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'}}}])
这将为您提供您想要的:
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'}
}
}
])
在
标记
数组被解构后,再将其自身放回一个集合中,然后您只需要获得该集合的项数或长度。您基本上需要包含在其中以获得“不同”的项数。所有“集合”在设计上都是“不同的”,通过从当前数组到空数组的“差异”[]
可以得到所需的结果。然后你可以申请
你也有一些常见的错误/误解。首先,在使用或任何MongoDB查询表达式时,不需要使用$和
,除非有明确的案例所有查询表达式参数都是“已经”和条件,除非另有明确说明,如$或
。所以在这种情况下不要显式使用
其次,您为每个字段使用显式字段路径变量。您不需要仅为了返回字段而这样做,并且除了在“表达式”中使用之外,您可以简单地使用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支持),那么请使用它,而不是指定文档中的所有其他字段
c1 = actors.aggregate([
{ "$match": { "fname"': f_name, "lname": l_name } },
{ "$addFields": {
"distinct_movies_played_in": {
"$size": { "$setDifference": [ "$acted_in.idmovies", [] ] }
}
}}
])
除非您明确需要只指定“某些”其他字段
这里的基本情况是,不要将用于数组操作,除非您明确地需要使用它的\u id
键指向从数组“内部”获得的值来执行操作
在所有其他情况下,MongoDB拥有比
$unwind
更高效的操作器来处理数组。您可以将$setDifference
与[]
一起使用,以删除重复项。类似于distinct_movies\u play_in':{'$size':{$setDifference:['$acted_in.idmovies',[]}
关于$unwind
操作符效率低下的有用见解。你的解决方案确实比我的更有效!感谢您:$countDistinct=$size:{$setDifference:['$myArray',[]]}