1

我正在使用 MongoDB,最终得到了两个集合(无意中)。

第一个集合(样本)有 1 亿条记录(推文),结构如下:

{
"_id" : ObjectId("515af34297c2f607b822a54b"),
"text" : "bla bla ",
"id" : NumberLong("314965680476803072"),
"user" : 
       {
        "screen_name" : "TheFroooggie",
        "time_zone" : "Amsterdam",
       },
}

来自推文集合的第二个集合(用户)有 3000 万条唯一用户记录,它看起来像这样

{ "_id" : "000000_n", "target" : 1, "value" : { "count" : 5 } }

其中 users 集合中的 _id 是 tweets 集合中的 user.screen_name ,目标是他们的状态(是否是垃圾邮件发送者),最后 value.count 是用户出现在我们的第一个集合(样本)集合中的数量(例如 number捕获的推文)

现在我想进行以下查询:

我想从用户的目标值 = 1 的示例集合(推文)中返回所有文档

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

4

1 回答 1

1

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

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

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

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

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

正如其他人指出的那样,设置适当的索引并使用光标循环浏览用户拉他们的推文并没有错。

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

于 2013-04-28T14:58:08.947 回答