2012-09-12 46 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