データベースに次のスキーマがあります。
{
id: 12345;
friends: [123,345,678,908]
},
{
id: 908;
friends: [123,345]
}
コレクション全体からすべての一意の友人 ID の配列を取得する方法はありますか?
異なる友人の値を取得するために、map/reduce ジョブを記述する必要はありません。
とにかく走れ:
> db.collection.distinct("friends")
[ 123, 345, 678, 908 ]
私は MongoDB の MapReduce 実装にあまり詳しくありませんが、マッパーに渡された値をキーとして書き出させ、単純に null 値を使用させることができると思います。
このようにして、レデューサーが特定のキー (フレンド ID) を 1 回だけ受け取るようにすることができ、値を繰り返し処理することなく、それを 1 回だけ書き出すことができます。とにかく値がnullなので、反復する意味はありません(反復する場合、キーを複数回書き出すことになることは言うまでもありません。確実に区別するために一度だけ書き出す必要があります。)
ただし、キーはレデューサー出力ファイル全体に分散されることに注意してください。たとえば、レデューサー 1 が出力123
し、レデューサー 2 が出力345
する可能性があるため、配列を構築するために出力ファイルの内容を後で統合する必要がある場合があります。