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