2017-06-16 44 views
2

我的actors集合包含一个名为acted_in的文档数组字段。而不是像acted_in.idmovies那样返回大小:{$size: $acted_in.idmovies},我想返回$acted_in.idmovies中不同值的数量。我怎样才能做到这一点 ?MongoDB统计数组中的不同项目

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

您可以使用'$ setDifference'和'[]'来移除重复项。类似'distinct_movies_played_in':{'$ size':{$ setDifference:['$ acted_in.idmovies',[]]}}' – Veeram

回答

1

这应该给你你想要的一切:tags阵列被解构,然后放回了一套自身

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

后,那么你只需要获得项目或长度的数量那套。

2

您基本上需要在其中包含$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相同的数组。

+0

关于'$ unwind'运算符效率低下的有用见解。你的解决方案确实比我的效率更高! –