好的,第一件事。您已经将数据结构化,就好像这是一个 RDBMS。你甚至跑掉并创建了一个“连接表”,好像这样的东西在 Mongo 中很有用。
对您的问题的简短回答是,您可能会重新定义“第一个”以加载给定的“书签”。带有 $in 子句的“服务器端”或带有大 for 循环的“客户端”。
所以关于数据的两个大问题:
- 如果书签完全属于房地产经纪人,为什么它们在自己的收藏中?
- 如果房地产经纪人可以为房屋和财产添加书签,那么为什么这些在不同的收藏中?这不是不必要的复杂化吗?如果您想在书签上使用 Realtor.first 之类的东西,为什么要将它们放在不同的集合中?
Realtors 集合可能应该由如下所示的项目组成:
{"name":"John", "bookmarks": [
{"h":"House1","notes":[{"Nice location","High Ask"}] },
{"p":"PropertyABC","notes":[{"Haunted"}] }
] }
请注意我如何区分房屋 ID 和财产 ID 的“h”和“p”?如果你接受我的下一个建议,你甚至不需要那个。
更进一步,您可能希望 Houses 和 Properties 在同一个集合中,例如“Locations”。在“Locations”集合中,您只需填充所有房屋和属性,并用“type”:“house”或“type”:“property”标记它们。然后,您将在“类型”字段上编制索引。
为什么?因为现在当您编写“第一个”方法时,您的查询非常简单。您所做的就是遍历“书签”并从“位置”集合中获取适当的键(“House1”、“PropertyABC”)。分页很简单,您查询 10 个项目然后返回。
我知道在某种程度上它看起来有点蹩脚。“为什么我要编写一个 for 循环来获取数据?我在 15 年前就试图停止这样做! ”但是 Mongo 是一个“面向文档”的存储,所以它针对加载单个文档。您正在尝试加载一堆文档,因此您必须跳过这个小圈。
幸运的是,这并不全是坏事。Mongo 在加载单个文档方面非常快。运行查询一次获取 10 个项目仍然非常快。