Как создать документ, который включает в себя массив ObjectIds другой коллекции (лучшая практика, RESTful)? - PullRequest
0 голосов
/ 06 июня 2019

Используя Mongoose и RESTful API Я хотел бы иметь 2 коллекции (organizations и projects), тогда как Schema первого должно содержать поле projects типа [ObjectId], который ссылается на документы последнего - и наоборот.Создавая новую организацию (POST / организации), можно либо (а) оставить поле projects пустым и добавить проектные документы позже (POST / проекты), либо (б) создать несколько проектов с ним уже.

проблемы для (b):

  1. Кажется, что это противоречит RESTfulness, потому что публикация новой организации должна иметь точку API, отличную от публикации нового проекта, - но мы хотим достичь обоихза один раз.

  2. Когда мы создаем новую организацию, поле projects должно содержать массив ObjectIds, ссылающихся на соответствующие проекты - но у них еще не будет идентификаторов.

Вероятно, есть много способов для достижения цели - например, 2 последовательных запроса POST: сначала проекты, затем организация.Но я хотел бы узнать о передовом опыте для этого сценария.

Схема Oranization:

{
    name: { type: String, required: true },
    address: { type: String },
    // projects = array of ObjectIds referring to Project documents
    projects: { type: [Mongoose.Schema.Types.ObjectId] }
}

Схема проекта:

{
    name: { type: String, required: true },
    start: { type: Date },
    end: { type: Date },
    organization: { type: Mongoose.Schema.Types.ObjectId }
}

Предоставлено описание проблемы и кодупрощенные примеры для большого проекта, в котором будет много моделей / коллекций с множеством перекрестных ссылок.

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

1 Ответ

0 голосов
/ 07 июня 2019

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

@ стабильность, спокойствие:

ресурсам не нужно сопоставлять вашу базу данных или модели приложений

Таким образом, в основном я мог бы рассматривать «Организацию» как ресурс, который может включать проект и выполнять запрос POST /organizations, и на стороне сервера я создаю новый документ для коллекции проектов, а затем новый документ для организаций. коллекция (где ObjectId документа проекта помещается в поле projects).

Проблема с этим будет в ответе, когда что-то не так с обновлением БД: в ответе должна содержаться информация о том, какой документ не удалось создать.

В качестве альтернативы можно отправить запрос POST /organizations, как только имя и адрес будут указаны в форме. Это приведет к добавлению организации в коллекцию организаций БД. Затем, если проект добавляется в ту же форму, мы выполняем еще один POST-запрос /projects, передавая вновь созданный идентификатор организации. На стороне сервера мы создаем новый документ проекта, а затем отправляем его идентификатор в массив проектов документа организации.

...