如何同时查询两个集合?

时间:2013-04-28 10:12:26

标签: mongodb join non-relational-database

我正在使用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的样本集(推文)中的所有文档

换句话说,我想返回所有垃圾邮件发送者的所有推文。

1 个答案:

答案 0 :(得分:1)

当您收到推文时,您可以将它们插入到集合中。使用作者信息作为更新的“查询”文档部分中的键。更新文档可以利用$addToSet运算符将推文放入推文数组中。你最终会得到一个包含作者和一系列推文的集合。然后,您可以为每位作者进行垃圾邮件发送者分类,并发送相关的推文。

所以,你最终会做这样的事情:

db.samples.update({"author":"joe"},{$addToSet:{"tweets":{"tweet_id":2}}},{upsert:true})

这种方法确实存在将文档增加到磁盘上最初分配大小的可能缺点,这意味着它将在磁盘上移动和扩展。您也可能会因索引更新而受到一些惩罚。

您还可以采用在每个推文文档中存储垃圾评级的方法,然后根据用户ID提取这些评级。

正如其他人所指出的那样,设置适当的索引并使用游标循环用户拉动他们的推文没有任何问题。

您选择的方法应基于您的预期访问模式。听起来你处在一个可以尝试几种不同解决方案的好地方。

相关问题