我有一个高度规范化的数据模型。目前,我通过存储_id
和运行顺序查询来从最深的集合中获取详细信息,使用手动引用。
引用是单向的,流大约有5-6个集合。对于一个特定的用例,我必须通过从更高级别的集合查询后续的"_id"来查询到最深处的集合。严格来说,每次我运行
时都会访问数据库db.collection_name.find(_id: ****).
我的主要目标是在不严重影响其他集合的原子性的情况下优化读取。我读过关于反规范化的文章,它对我来说没有意义,因为我想保留一个改变基数的选项,因此想要维护一个单独的集合。
我最初的想法是使用MapReduce从后面进行聚合,并为特定的用例提供一个集合。但即使这样听起来也不太好。
在关系数据库中,我将在子查询中分解查询,并执行连接以获得与初始结果相交的数据集。由于mongodb不支持连接,我有一个艰难的时间弄清楚任何事情。
如果你以前遇到过类似的事情,或者有任何想法如何解决,请帮助。
非规范化数据。
MongoDB不做JOIN's - period.
没有从多个集合中获取数据的操作。不是find()
,不是aggregate()
,也不是MapReduce
。当您需要将来自多个集合的数据混淆在一起时,除了在应用程序层上完成之外,没有其他方法。因此,您应该以一种方式组织数据,以便通过查询单个集合来解决任何常见的和与性能相关的查询。
为了做到这一点,你可能不得不创建冗余和传递依赖。这在MongoDB中很正常。
如果你觉得这很"脏",那么你应该接受你的性能不是最优的事实,或者使用不同类型的数据库,比如经典的关系数据库或图形数据库。