1

userユーザー情報で構成されるコレクションがあります。

そのユーザー コレクション内にはskills、ユーザー固有の配列があります。

skillそのリストを参照テーブルとして使用できるように、すべてのユーザーが持っているすべてからコレクションを作成するにはどうすればよいですか?

4

1 に答える 1

1

次のような構造のデータがあると仮定します。

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);
于 2013-10-14T07:42:05.877 に答える