1
我有一个名为user
的集合,它由用户信息组成。根据文档的原始列表创建文档列表mongodb
在该用户集合中,我有一个特定于用户的skills
数组。
我如何从每个skill
创建一个集合,以便每个用户都可以将该列表用作查找表?
我有一个名为user
的集合,它由用户信息组成。根据文档的原始列表创建文档列表mongodb
在该用户集合中,我有一个特定于用户的skills
数组。
我如何从每个skill
创建一个集合,以便每个用户都可以将该列表用作查找表?
假设你有结构化这样的数据:
db.users.insert({name:'ninja', skills: ['katana', 'shuriken']});
db.users.insert({name:'developer', skills: ['c#', 'sql', 'katana', 'mongodb']});
你可以使用一个aggregation让你users
有所有skills
的列表。
更具体地说,聚集看起来是这样的:
db.users.aggregate([
{ $unwind: '$skills' },
{ $group: {_id: '$skills'} }
]);
有在上述聚合两个步骤:
注:为了更好地理解的$unwind
一步做什么,你只能与该步骤运行聚集:以上db.users.aggregate([ { $unwind: '$skills' } ]);
两步聚集的结果是这样的:
{
"result": [
{ "_id": "mongodb" },
{ "_id": "sql" },
{ "_id": "c#" },
{ "_id": "shuriken" },
{ "_id": "katana" }
],
"ok": 1
}
最后,为了将这些结果保存到一个名为skills
新的集合,你可以在蒙戈shell中运行以下命令:
> var unique_skills = db.users.aggregate([ { $unwind: '$skills' }, { $group: {_id: '$skills'} } ]).result;
> db.skills.insert(unique_skills);
为延迟接受答案而抱歉!我将如何使用您的示例按需重建? – user2877629
这取决于你的情况。如果数据量不多,则可以在每次需要时运行聚合并直接使用其结果(而不是将其保留到任何集合)。否则,你可以写一个刷新数据的过程。如果你有大量的数据,你可能需要查看[incremental map-reduce](http://docs.mongodb.org/manual/tutorial/perform-incremental-map-reduce/) – GolfWolf
+1在构建聚合,你可以作为一个集合来访问它吗?我将如何搜索/查询它? – user2877629