2010-05-23 3 views
0

Я новичок в MongoDB, и я использовал RDBMS в течение многих лет.Обертывание головы вокруг MongoDB, mongomapper и присоединяется

Во всяком случае, скажем, у меня есть следующие коллекции:

 
Realtors 
many :bookmarks 
key :name 


Houses 
key :address, String 
key :bathrooms, Integer 


Properties 
key :address, String 
key :landtype, String 


Bookmark 
key :notes 

Я хочу Realtor, чтобы быть в состоянии закладки на дом и/или недвижимости. Обратите внимание: Дома и объекты являются автономными и не имеют представления о риэлторах или закладах. Я хочу, чтобы закладка была похожа на «таблицу соединений» в MySQL.

Дома/объекты из разных источников, поэтому их нельзя изменить.

Я хотел бы быть в состоянии сделать это в Rails:

г = Realtor.first r.bookmarks бы мне:

House1 House2 PropertyABC PropertyOO1 и т.д ...

Будут тысячи домов и объектов.

Я понимаю, что для этого были созданы РСУБД. Но есть несколько причин, по которым я использую MongoDB, поэтому я хотел бы сделать эту работу.

Любые предложения о том, как сделать что-то подобное, будут оценены.

Спасибо!

ответ

2

OK, сначала сначала. Вы структурировали свои данные, как если бы это была РСУБД. Вы даже убежали и создали «таблицу соединений», как если бы такая вещь была полезной в Монго.

Короткий ответ на ваш вопрос состоит в том, что вы, вероятно, собираетесь переопределить «первый» для загрузки данных «Закладок». Либо «серверная сторона» с предложением $ in, либо «клиентская сторона» с большим циклом for.

Так два больших вопроса о данных:

  1. Если закладки полностью принадлежат риэлтеров, почему они в своей собственной коллекции?
  2. Если риэлторы могут заложить дома и Недвижимость, то почему они находятся в разных коллекциях? Разве это ненужное осложнение? Если вы хотите что-то вроде Realtor.first на закладках, зачем их ставить в разные коллекции?

Коллекция Риэлторы должны, вероятно, будет состоять из элементов, которые выглядят следующим образом:

{"name":"John", "bookmarks": [ 
    {"h":"House1","notes":[{"Nice location","High Ask"}] }, 
    {"p":"PropertyABC","notes":[{"Haunted"}] } 
] } 

Обратите внимание, как я дифференцированный «ч» и «р» для ID дома и ID недвижимости ? Если вы примете мое следующее предложение, вам это не понадобится.

Принимая этот шаг дальше, вы, вероятно, хотите, чтобы дома и объекты в той же коллекции, скажем, «Местоположения». В коллекции «Locations» вы просто собираете все Дома и свойства и отмечаете их «type»: «house» или «type»: «property». Затем вы индексируете поле «тип».

Почему?Потому что теперь, когда вы пишете «первый» метод, ваш запрос довольно прост. Все, что вы делаете, - это цикл через «закладки» и захватить соответствующий ключ («House1», «PropertyABC») из коллекции «Locations». Пейджинг прямолинейный, вы запрашиваете 10 предметов, а затем возвращаетесь.

Я знаю, что на каком-то уровне это похоже на хромой. »Почему я пишу цикл for для захвата данных? Я пытался прекратить это делать 15 лет назад!« Но Mongo - это «ориентированный на документ», магазина, поэтому он оптимизирован для загрузки отдельных документов. Вы пытаетесь загрузить кучу документов, поэтому вам придется перепрыгнуть через этот маленький обруч.

К счастью, это не так уж плохо. Mongo действительно быстро при загрузке отдельных документов. Выполнение запроса для извлечения 10 элементов одновременно будет очень быстрым.

+0

Спасибо за подсказку. Я переосмыслил свой процесс проектирования и еще немного поехал. Я склоняюсь к чему-то вроде хранения массива House_Ids (поскольку они статичны и мало меняются) и вставляют все остальное. Это дает некоторые «реляционные» качества, которые я чувствую, не победив цель MongoDB. – cbmeeks

+0

Если вы сделаете что-то подобное, вы, вероятно, получите то, что хотите. Я бы не вставлял «дом» или «свойство», но если вы храните их в одной коллекции, это упростит «поиск по закладкам». Риэлторы: {"name": "John", "bookmarks": [ {"h": ref, "notes": [{"Nice location", "High Ask"}]}, {"h ": ref," notes ": [{" Haunted "}]} ]} –

Смежные вопросы