user
ユーザー情報で構成されるコレクションがあります。
そのユーザー コレクション内にはskills
、ユーザー固有の配列があります。
skill
そのリストを参照テーブルとして使用できるように、すべてのユーザーが持っているすべてからコレクションを作成するにはどうすればよいですか?
user
ユーザー情報で構成されるコレクションがあります。
そのユーザー コレクション内にはskills
、ユーザー固有の配列があります。
skill
そのリストを参照テーブルとして使用できるように、すべてのユーザーが持っているすべてからコレクションを作成するにはどうすればよいですか?
次のような構造のデータがあると仮定します。
db.users.insert({name:'ninja', skills: ['katana', 'shuriken']});
db.users.insert({name:'developer', skills: ['c#', 'sql', 'katana', 'mongodb']});
集約を使用skills
して、持っているすべてのリストを取得できますusers
。
より具体的には、集計は次のようになります。
db.users.aggregate([
{ $unwind: '$skills' },
{ $group: {_id: '$skills'} }
]);
上記の集計には 2 つの手順があります。
注: ステップの動作をよりよく理解するために、$unwind
そのステップのみで集計を実行できます。db.users.aggregate([ { $unwind: '$skills' } ]);
上記の 2 段階集計の結果は次のようになります。
{
"result": [
{ "_id": "mongodb" },
{ "_id": "sql" },
{ "_id": "c#" },
{ "_id": "shuriken" },
{ "_id": "katana" }
],
"ok": 1
}
最後に、これらの結果を という新しいコレクションに保存するためにskills
、mongo シェルで次のコマンドを実行できます。
> var unique_skills = db.users.aggregate([ { $unwind: '$skills' }, { $group: {_id: '$skills'} } ]).result;
> db.skills.insert(unique_skills);