【问题标题】:How to query two collections at the same time?如何同时查询两个集合?
【发布时间】: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


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 欢迎来到 StackOverflow。请注意,不建议在问题或答案上签名和签字。 :-)
  • 这是一个性能非常差的模式 - 每个用户文档都会无限增长,而且要从某人那里获取最新的推文,您必须查询他们推文的整个子集。像 OP 那样拥有两个集合并没有本质上的错误,它们只需要制定一个查询策略,这些查询必须同时访问两者的信息(两个查询或非规范化某些信息)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2016-09-27
  • 2014-02-23
  • 1970-01-01
  • 2012-05-11
  • 2023-01-12
相关资源
最近更新 更多