围绕MongoDB,mongomapper和加入我的头

时间:2010-05-23 15:42:40

标签: ruby-on-rails associations mongodb mongomapper

我是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有几个原因,所以我想让这个工作。

任何有关如何做这样的事情的建议都会受到赞赏。

谢谢!

1 个答案:

答案 0 :(得分:2)

好的,首先要做的事情。您已经将数据结构化,就好像这是一个RDBMS。你甚至已经跑掉并创建了一个“连接表”,好像这样的东西在Mongo中很有用。

对你的问题的简短回答是,你可能会重新定义“第一个”以加载给定的“书签”。带有$ in子句的“服务器端”或带有大型for循环的“客户端”。

关于数据的两个重要问题:

  1. 如果书签完全属于房地产经纪人,为什么他们在自己的收藏中呢?
  2. 如果房地产经纪人可以将房屋属性书签,那么为什么这些属于不同的馆藏?这不是必然的并发症吗?如果你想在书签上使用像Realtor.first这样的东西,为什么要将它们放在不同的集合中呢?
  3. 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个项目仍然会非常快。