mongodb - 在 MongoDB 中搜索多个集合

标签 mongodb mongodb-query aggregation-framework

我知道 MongoDB 的理论和不支持连接的事实,我应该尽可能使用嵌入文档或非规范化,但这里是:

我有多个文档,例如:

  • 嵌入郊区的用户,但也有:名字,姓氏
  • 嵌入国家的郊区
  • 嵌入School的Child属于一个User,但也有:first name, last name

例子:

Users:
{ _id: 1, first_name: 'Bill', last_name: 'Gates', suburb: 1 }
{ _id: 2, first_name: 'Steve', last_name: 'Jobs', suburb: 3 }

Suburb:
{ _id: 1, name: 'Suburb A', state: 1 }
{ _id: 2, name: 'Suburb B', state: 1 }
{ _id: 3, name: 'Suburb C', state: 3 }

State:
{ _id: 1, name: 'LA' }
{ _id: 3, name: 'NY' }

Child:
{ _id: 1, _user_id: 1, first_name: 'Little Billy', last_name: 'Gates' }
{ _id: 2, _user_id: 2, first_name: 'Little Stevie', last_name: 'Jobs' }

我需要实现的搜索是:

  • 用户和 child 的名字、姓氏
  • 来自用户的状态

我知道我必须执行多个查询才能完成它,但是如何实现呢?使用 mapReduce 还是聚合?

你能指出一个解决方案吗?

我尝试使用 mapReduce,但这并没有让我从用户那里获得包含 state_id 的文档,所以这就是我在这里提出它的原因。

最佳答案

This answer is outdated. Since version 3.2, MongoDB has limited support for left outer joins with the $lookup aggregation operator

MongoDB 不执行跨越多个集合的查询 - 周期。当您需要连接来自多个集合的数据时,您必须在应用程序级别通过执行多个查询来完成。

  1. 查询集合 A
  2. 从结果中获取辅助键并将它们放入数组中
  3. 查询集合 B 将该数组作为 $in-operator 的值传递
  4. 在应用层以编程方式加入两个查询的结果

必须这样做应该是异常(exception)而不是常态。当您经常需要模拟这样的 JOIN 时,要么意味着您在设计数据库架构时仍然考虑过于关系化,要么您的数据根本不适合 MongoDB 的基于文档的存储概念。

关于mongodb - 在 MongoDB 中搜索多个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20056903/

相关文章:

mongodb - 如何返回数组字段大小大于给定数字的所有文档?

MongoDB 使用索引搜索空的 objectId 字段的有效方法?

mongodb - 加入两个数组的相关属性

MongoDB 复合索引

mongodb - 如何为多个数据中心设置 MongoDB?

mongodb - 将总计数添加到分组+汇总数据

具有 3 个级别的 MongoDB 嵌套查找

mongodb - 按数组中的字段值过滤文档,Mongodb

mongodb - 子文档上的 Mongoose 唯一索引

mongodb - 在具有只读FS的Docker中运行Mongodb