2017-06-16 6 views
2

私のactorsコレクションにはacted_inと呼ばれる文書配列フィールドが含まれています。 {$size: $acted_in.idmovies}のように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'を' [] 'とともに使用すると、重複を削除できます。 – 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を使用する必要はありません。 $orのように、明示的に指定されていない限り、クエリ式の引数は "既に" AND条件です。したがって、この場合は明示的に使用しないでください。

次に、$projectは、フィールドごとに明示的なフィールドパス変数を使用していました。

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

実際には、あなたが実際にしている場合:あなたはそれを含めるあなたは、単に記譜する1を使用することができ、単に「表現」のフィールドを返す、と使用の外にいることを行う必要はありません。 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'演算子の非効率性についての有用な情報を提供します:' $ _ 'あなたのソリューションは、実際に私よりも効率的です! –

関連する問題