【发布时间】:2013-04-28 10:12:26
【问题描述】:
我正在使用 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,target 是他们的状态(是否是垃圾邮件发送者),最后 value.count 是用户出现在我们的第一个集合(示例)集合中的数量(例如捕获的推文数量)
现在我想进行以下查询:
我想返回用户目标值为 1 的样本集合(推文)中的所有文档
换句话说,例如,我想返回所有垃圾邮件发送者的所有推文。
【问题讨论】:
-
查询一次只能作用于一个集合。没有连接。有一些框架可以使它看起来像是有连接,但这是一种错觉,实际上已经进行了许多查询。 StackOverflow 上有很多关于此的问题/答案。
-
感谢 WiredPrairie 的评论。我确实探索了 StackOverflow 中的一些解决方案地址,但许多解决方案的效率不足以容纳我拥有的记录数量,或者它们不适合我的需求。我想知道将“用户”(第二个集合)和他们的推文作为子文档的第三个集合实际上是否很简单。但是,我需要一个有效的实现来在合理的时间内完成这项工作,我会感谢任何帮助,因为我是这个非关系世界的初学者
-
您不想将推文嵌入到用户文档中。在这里进行两个查询有什么问题?如果事物被正确索引,它将相当快(肯定比维护第三个集合要快)。如果在一个查询中执行此操作很关键,您可以将目标字段非规范化为推文集合用户子文档,然后进行批处理作业,当有人“重新分类”时更新它们。
-
是的,我完全同意,将推文作为子文档嵌入的问题实际上会变得无限。这两个查询会是什么样子?我的意思是,如果我在用户数据库中查询目标为 1 的用户,我会得到一个包含部分结果的迭代器,我如何将它传递给第二个查询以获取他们的推文?顺便说一句,如果答案是微不足道的,我提前道歉,我对此很陌生:)
标签: mongodb join non-relational-database