"個別の"項目を取得するには、基本的に$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
の配列を操作するためのはるかに効率的な演算子を備えています。
'$ setDifference'を' [] 'とともに使用すると、重複を削除できます。 – Veeram