Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-模拟联接或子查询_Mongodb - Fatal编程技术网

MongoDB-模拟联接或子查询

MongoDB-模拟联接或子查询,mongodb,Mongodb,我试图找出在Mongo中构造数据的最佳方法,以模拟SQL中的简单联接或子查询 假设我有一个经典的用户和帖子示例,用户在一个集合中,帖子在另一个集合中。我想找到所有的用户谁的城市是“伦敦”的帖子 在这个问题上,我简化了一些事情,在我的真实场景中,在用户文档中以数组形式存储帖子是行不通的,因为每个用户不断插入1000篇“帖子” Mongos$in操作员可以在此提供帮助吗?$in可以处理10000000个条目的数组吗?我也有类似的设置,但我的设置是针对“用户”和“消息”的。我所做的是添加对用户的引用,

我试图找出在Mongo中构造数据的最佳方法,以模拟SQL中的简单联接或子查询

假设我有一个经典的用户和帖子示例,用户在一个集合中,帖子在另一个集合中。我想找到所有的用户谁的城市是“伦敦”的帖子

在这个问题上,我简化了一些事情,在我的真实场景中,在用户文档中以数组形式存储帖子是行不通的,因为每个用户不断插入1000篇“帖子”


Mongos$in操作员可以在此提供帮助吗?$in可以处理10000000个条目的数组吗?

我也有类似的设置,但我的设置是针对“用户”和“消息”的。我所做的是添加对用户的引用,有点像外键。我使用用户集合中生成的“_id”并将其作为键存储在“messages”中。对于用户发送的每一条消息,我都将其保存到“messages”集合中。你应该仔细阅读,我想这就是你要找的


您必须运行多个查询,但您绝对应该在应用程序端执行此操作。

$in可以处理100000个条目。我从未尝试过10000000个条目,但查询(查询也是文档)必须小于4mb(就像每个文档一样),因此100000000个条目是不可能的

为什么不将用户及其所在城镇包括在Posts集合中?您可以索引此城镇,因为您可以索引嵌入实体的属性。您不再需要模拟加入,因为您可以查询嵌入用户所在城镇的帖子


这意味着当用户所在城市发生变化时,您必须更新帖子,但这种情况并不经常发生。如果在Posts集合中为UserId编制索引,此更新将非常快

老实说,如果你不能将“帖子”融入“用户”,那么你有两个选择

  • 对帖子中的一些用户数据进行非规范化处理。然后,您可以只搜索一个集合
  • 做两个查询。(一个查找用户,另一个查找帖子)
  • 根据你的问题,你想做的是#2

    理论上,您可以构建一个用户ID(或ref)列表,然后在该数组中查找属于用户
    $的所有帖子。但显然,这种方法是有限的

    $in可以处理10000000个条目的数组吗

    看,如果你打算在一组10000000用户中为所有用户“查询”你的帖子,那么你已经远远超过了“查询”阶段。你自己说每个用户都有1000条帖子,所以你说的是一个查询“居住在伦敦的有帖子的用户”,返回100毫秒的记录

    100M记录不是查询,而是数据集


    如果您担心在
    命令中破坏
    $in,那么我强烈建议您使用map/reduce。Mongo Map/Reduce将为您创建一个新集合。然后,您可以根据需要缩减或汇总此数据集。

    作为旁注,文档限制在最近的64位版本中已显著提高。(24MB)