我是MongoDB的新手,多年来我一直使用RDBMS。
无论如何,假设我有以下收藏品:
Realtors many :bookmarks key :name Houses key :address, String key :bathrooms, Integer Properties key :address, String key :landtype, String Bookmark key :notes
我希望房地产经纪人能够为房屋和/或房产添加书签。请注意,房屋和房产是独立的,不知道房地产经纪人或书签。我希望Bookmark有点像MySQL中的“连接表”。
房屋/房产来自不同的来源,因此无法修改。
我希望能够在Rails中执行此操作:
r = Realtor.first r.bookmarks会给我:
House1 House2 PropertyABC PropertyOO1 等...
将会有成千上万的房屋和房产。
我意识到这就是RDBMS的用途。但是我使用MongoDB有几个原因,所以我想让这个工作。
任何有关如何做这样的事情的建议都会受到赞赏。
谢谢!
答案 0 :(得分:2)
好的,首先要做的事情。您已经将数据结构化,就好像这是一个RDBMS。你甚至已经跑掉并创建了一个“连接表”,好像这样的东西在Mongo中很有用。
对你的问题的简短回答是,你可能会重新定义“第一个”以加载给定的“书签”。带有$ in子句的“服务器端”或带有大型for循环的“客户端”。
关于数据的两个重要问题:
Realtors系列可能应该由看起来像这样的项目组成:
{"name":"John", "bookmarks": [
{"h":"House1","notes":[{"Nice location","High Ask"}] },
{"p":"PropertyABC","notes":[{"Haunted"}] }
] }
请注意我如何区分房屋的ID和房产的ID“h”和“p”?如果你采取我的下一个建议,你甚至不需要。
更进一步,您可能希望在同一个集合中使用Houses和Properties,比如说“Locations”。在“地点”集合中,您只需填写所有房屋和房产,并用“类型”标记它们:“房屋”或“类型”:“房产”。然后你将在“类型”字段上编入索引。
为什么呢?因为现在当你编写“第一”方法时,你的查询非常简单。您所做的只是遍历“书签”并从“位置”集合中获取相应的键(“House1”,“PropertyABC”)。分页是直接的,您查询10个项目然后返回。
我知道在某种程度上它似乎有点蹩脚。“为什么我要写一个for循环来获取数据?我试图在15年前停止这样做!”但是Mongo是一个“面向文档的“存储,因此它针对加载单个文档进行了优化。你正试图加载一堆文件,所以你必须跳过这个小箍。
幸运的是,这并不全是坏事。 Mongo在加载单个文档时非常 。运行查询一次获取10个项目仍然会非常快。