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',[]]}