我正在使用MongoDB,最后我收到了两个收藏集(无意中)。
第一个Collection(样本)有1亿条记录(推文),结构如下:
{
"_id" : ObjectId("515af34297c2f607b822a54b"),
"text" : "bla bla ",
"id" : NumberLong("314965680476803072"),
"user" :
{
"screen_name" : "TheFroooggie",
"time_zone" : "Amsterdam",
},
}
第二个Collection(用户),来自tweet集合的3000万独特用户记录,看起来像这样
{ "_id" : "000000_n", "target" : 1, "value" : { "count" : 5 } }
其中,users集合中的_id是来自tweets集合的user.screen_name,目标是他们的状态(垃圾邮件发送者与否),最后,value.count是用户在我们的第一个集合(样本)集合中出现的数字(例如,捕获的推文数量)
现在我想提出以下问题:
我希望返回用户具有目标值= 1的样本集(推文)中的所有文档
换句话说,我想返回所有垃圾邮件发送者的所有推文。
答案 0 :(得分:1)
当您收到推文时,您可以将它们插入到集合中。使用作者信息作为更新的“查询”文档部分中的键。更新文档可以利用$addToSet
运算符将推文放入推文数组中。你最终会得到一个包含作者和一系列推文的集合。然后,您可以为每位作者进行垃圾邮件发送者分类,并发送相关的推文。
所以,你最终会做这样的事情:
db.samples.update({"author":"joe"},{$addToSet:{"tweets":{"tweet_id":2}}},{upsert:true})
这种方法确实存在将文档增加到磁盘上最初分配大小的可能缺点,这意味着它将在磁盘上移动和扩展。您也可能会因索引更新而受到一些惩罚。
您还可以采用在每个推文文档中存储垃圾评级的方法,然后根据用户ID提取这些评级。
正如其他人所指出的那样,设置适当的索引并使用游标循环用户拉动他们的推文没有任何问题。
您选择的方法应基于您的预期访问模式。听起来你处在一个可以尝试几种不同解决方案的好地方。