Ссылки на две коллекции документов друг на друга в MongoDB - PullRequest
1 голос
/ 19 февраля 2020

Можно ли связать 2 документа друг с другом, используя ref, и если это возможно, рекомендуется ли это и является ли это хорошей практикой? Вот так:

Модель коллекции FirstDocumentId:

const FirstDocumentId = mongoose.model(
    'FirstDocumentId',
    new mongoose.Schema({
        coolField: String,
        secondDocumentId: {type: Mongoose.Schema.Types.ObjectId, ref: 'secondDocumentId'}
    })
);

Модель коллекции SecondDocumentId:

const SecondDocumentId = mongoose.model(
    'SecondDocumentId',
    new mongoose.Schema({
        someField: String,
        firstDocumentId: {type: Mongoose.Schema.Types.ObjectId, ref: 'firstDocumentId'}
    })
);

Точка это означает создание отношения 1 к 1 и возможность легкого доступа к обоим документам.

Я знаю, что могу просто сослаться на 1, не ссылаясь на второе-первое, но я подумал, что было бы проще изменить их и.

1 Ответ

0 голосов
/ 19 февраля 2020

Да, вы можете ссылаться на коллекцию на другую коллекцию, как и вы, в идеале именно так и поддерживаются отношения между двумя коллекциями в MongoDB, но вы должны понимать, что MongoDB не содержит схем, прямого способа создания нет. / обновить / удалить документы во второй коллекции путем создания / обновления / удаления относительных документов в первой коллекции (коллекции и их документы являются независимыми - операции выполняются на уровне c на уровне документов). Так как прямого пути нет - вы должны написать логи приложения c или какое-то пакетное задание или MongoDB-стежок для обеспечения ведения справки.

  1. Но тогда, если вы спросите, зачем поддерживать? - Как вы, возможно, знакомы с JOINS в SQL, именно так мы можем очень хорошо выполнять чтение, используя ссылки.
  2. Так как? - MongoDB имеет структуру агрегации, которая является мощным средством для запросов к базе данных. В агрегации есть оператор, называемый $ lookup , который полезен для выполнения JOINS . Для этого вы поддерживаете ссылки. Вы также можете проверить $ graphLookup .
  3. Должен ли я использовать ref ? - Так как я уже говорил о $lookup - это полезный оператор. Поэтому, используя его, вам не нужно указывать ref для этих полей. Если вы используете mon go shell или любой клиент, например robo3T или mon go compass , или любой собственный драйвер, например mongodb driver для node.js вы можете использовать родной $lookup. Даже вы можете использовать поиск при использовании mon goose, но mon goose утверждает, что у них .populate () , что очень сильно по сравнению с нативным $lookup, для использования которого вы будете использовать ref. Кроме того, его нельзя использовать, даже имея те же модели, вы можете использовать $lookup с mon goose вместо заполнения.
  4. Справочные поля - так что вы не ограничены _id поля, вы можете ссылаться на любое поле, но значения и типы должны совпадать в обеих коллекциях, так что это может быть легко при запросе, в противном случае вам нужно преобразовывать одно в другое при каждом запросе, поэтому будьте осторожны при записи.
  5. Нужно ли сохранять ссылки в обеих коллекциях - сначала это необязательно, сначала кажется, что это легко или нормально, но когда ваша коллекция в конце концов вырастет, поддержание ссылок будет трудной задачей - вам может понадобиться написать / удалить / обновлять в двух коллекциях каждый раз, когда нужно построить индексы, размер документа / размер коллекции может возрасти, поэтому было бы лучше поддерживать ссылки на основе ваших запросов. Проверьте этот документ на дизайн данных: моделирование данных .
...