njnesterov
@njnesterov
CEO EventSide LLC

Как правильно связать два объекта в Mongoose (MongoDB)?

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

Схемы:
var userSchema = new mongoose.Schema({
    name: String,
    stories: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Story' }]
});
var storySchema = new mongoose.Schema({
    name: String,
    user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
});


Мне нужно сохранить story так чтобы у нее был свой user, а у user был свой массив id-шников story. Я скорее всего делаю неправильно, при сохранении story я кладу _id user-a в story:

var story = new Story({
  name: 'some name',
  user: user._id
});
event.save();


Естественно story сохраняется с user id, но у данного user-а не появляется в массиве id-шник или объект этой story.
user: {
   name: 'User Name',
   stories: [] //тут пусто
 }


Что я делаю не так? Как правильно сохранять объекты со связями?
Или после сохранения дочернего объекта нужно делать update родительскому
  • Вопрос задан
  • 3467 просмотров
Решения вопроса 1
@dimonnwc3
Во первых:
user: user._id - сохранять надо не сам айди в строке, а mongoose ObjectID
Так гласит схема "user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }"

Но mongoose немножко умный, поэтому можно в user вставлять самого юзера полученного при запросе из базы, а mongoose сам добавит корректый ObjectID в поле.
Важно, чтобы user был именно mongoose объектом со всеми методами, а не очищенный plainobject.

Далее в монго нету foreign key, поэтому такие схемы как выше не желательны. Где юзер ссылается на стори, а стори на юзера. Получается при любых операциях со стори, надо апдейтить юзера и обратно. А это 2 запроса.

Тут либо в user пишется массив story либо, либо каждой story присваивается создатель.
Т.е либо родитель имеет инфу о ребенке, либо ребенок о родителе, НО не то и другое вместе.

Какой способ лучше, зависит от конкретной ситуации, нужно смотреть какая информация и как выводиться чаще.

Я бы предпочел хрнаить в каждой story userid. А user оставить пустым.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bromzh
Drugs-driven development
Что я делаю не так?

Используешь монго там где не надо.
Как правильно сохранять объекты со связями?

Взять реляционную БД. В самом названии есть намёк, что такие БД хорошо подходят для хранения объектов со связями.

Вот какой смысл брать монгу и пытаться построить архитектуру в стиле реляционных БД? Что мешает хранить story в поле документа юзера?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы