MongoDB计算数组中的不同项

时间:2017-06-16 18:30:39

标签: python mongodb pymongo

我的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'}}}])

2 个答案:

答案 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数组后再将其放回一组自身,然后你需要获得该项的数量或长度。