mongoid / mongodb - копирование / копирование записей - PullRequest
0 голосов
/ 05 июля 2011

Я создаю CMS, где сайт и страницы хранятся в Монго. Мне нужно иметь возможность создать новый сайт, используя другой сайт в качестве шаблона.

Например:

   Site A - news page and home page 

Создайте новый сайт, выбрав сайт A в качестве шаблона, он выберет сайт A, а затем сделает копии каждой страницы, принадлежащей сайту A, и сохранит их под сайтом B

Результат

   Site A - news page and home page 
   Site B - news page and home page 

Сайт B сможет затем использовать сайт A в качестве отправной точки для создания там нового сайта.

Я новичок в Mongo / Mongoid, поэтому очень хотел бы получить несколько советов о том, как лучше всего подойти к этому.

Спасибо

1 Ответ

1 голос
/ 05 июля 2011

Один из способов организации данных - использовать коллекции с идентификатором сайта в качестве пространства имен, предоставляя такие коллекции, как:

site_a.pages
site_a.news
site_a.users
site_b.pages
site_b.news
site_b.users

Чтобы создать новый сайт из существующего, вы должны скопировать соответствующие коллекции (возможно, исключая, например, .users), изменив пространство имен. То есть скопируйте site_a.pages в site_c.pages. В оболочке :

db.site_a.pages.find().forEach( function(x){db.site_c.pages.insert(x)} );

Обратите внимание, что site_a - это не имя базы данных, а пространство имен коллекции .

Существует ограничение на количество коллекций в базе данных, которое может быть проблемой, если вы размещаете CMS в облаке для многих клиентов. Вы можете обойти это, имея разные базы данных для разных клиентов. Вы должны прочитать документацию по этому для получения более подробной информации.

Еще один способ сделать это - поместить идентификатор сайта в каждый документ и всегда фильтровать его в своих запросах. Тогда у вас будет только несколько коллекций, например:

pages
news
users

С документами в этих коллекциях, имеющими поле site_id:

{
    "site_id": "site_a",
    "page_title": "Homepage",
    ...
}

Копирование будет аналогично приведенному выше (но с фильтрами и обновлением поля site_id в функции). Однако я думаю, что пространства имен для коллекций - более аккуратный подход.

...