Оборачиваясь вокруг MongoDB, mongomapper и объединений - PullRequest
0 голосов
/ 23 мая 2010

Я новичок в MongoDB и много лет пользуюсь RDBMS.

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

Realtors
 many :bookmarks
 key :name


Houses
 key :address, String
 key :bathrooms, Integer


Properties
 key :address, String
 key :landtype, String


Bookmark
 key :notes

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

Дома / Свойства взяты из другого источника, поэтому они не могут быть изменены.

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

r = Realtor.first r.bookmarks дал бы мне:

House1 Дом2 PropertyABC PropertyOO1 и т.д ...

Там будут тысячи домов и недвижимости.

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

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

Спасибо!

1 Ответ

2 голосов
/ 24 мая 2010

ОК, обо всем по порядку. Вы структурировали свои данные так, как будто это была СУБД. Вы даже убежали и создали «таблицу соединений», как будто такая вещь была полезна в Mongo.

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

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

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

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

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

Заметьте, как я различал "h" и "p" для ID дома и ID недвижимости? Если вы примете мое следующее предложение, вам даже это не понадобится.

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

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

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

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

...