2012-09-12 24 views
0

我目前有一個非常非結構化的mongodb數據庫。我試圖在twitter上提取給定配置文件集中的所有追隨者。我的數據庫看起來像這樣:在mogodb中添加索引

{'123':1 
'123':2 
'123':3 
'567':8 
'567':9 
} 

其中每個鍵是一個用戶並且該值是單個跟隨者。當我試圖在這些密鑰上創建索引時,由於我有很多用戶(800萬),因此我只用盡了可用的索引。谷歌搜索後,我發現我能夠擁有的最大索引數量大約是64.如何在這個數據庫上創建適當的索引?或者你會建議一種不同的方式來存儲我的數據?

+0

每個集合可以有64個不同的索引_definitions_;我知道這些索引可以支持的文檔數量沒有限制。 – JohnnyHK

+0

我所有的800萬條目都在一個集合中。在我上面的例子中,我將需要2個索引。一個索引鍵123,另一個索引567.我有近3000個這樣的唯一鍵。 – Amitash

+1

好吧,聽起來像索引你當前的模式是不可行的,你需要考慮修改你的模式,以便你的'123','567'等鍵變成共同的值而不是。 – JohnnyHK

回答

0

你應該以不同的方式構造你的數據。

我會建議你有一個「用戶」文件的集合,其中每個用戶都有一個數組「追隨者」。這個數組應該填充關注用戶的唯一標識符(如姓名,_id或您自己的ID號碼)。

{ name: "userA", 
    followers: [ 
    "userB", 
    "userC" 
    ] 
}, 
{ name: "userB", 
    followers: [ 
    "userD", 
    "userF" 
] 
}, 

然後,您可以在followers字段上創建索引,以快速找到所有跟隨其他用戶的用戶。當你想找到誰遵循用戶「用戶X」,「userY」和「userZ」的所有用戶,那麼您需要與此查詢做到這一點:

db.users.find({followers: { $all: ["userX", "userY", "userZ" ] } }); 

編輯:

添加跟隨器給用戶,使用$推操作者:

db.users.update({name:"userA"}, { $push: { followers: "userB" } }); 

的$拉操作者可以被用來去除陣列enries:

db.users.update({name:"userA"}, { $pull: { followers: "userB" } }); 
+0

本例中的單個列表可能包含超過100萬的關注者。我怎樣才能輕鬆地插入和更新到這個領域?另外,我不能只創建一個數據庫,如下所示:{followers:{'123':456,'123':567,....}}? – Amitash

+0

這不起作用,因爲字段'123'不能同時具有值​​456和567.我在答案的末尾添加了一個段落,它解釋瞭如何添加和刪除數組中的單個條目。 – Philipp