Я работаю с моделями и образцами Mongoose. Я использовал код с веб-сайта мангуста, где говорится о методе заполнения и ссылках. Я пытаюсь сохранить соответствующие идентификаторы "ссылочных" в обеих моделях. Это только сохранение идентификаторов ссылок в сюжетной модели. Вот код:
Обновление: добавлены схемы вверху, чтобы помочь:
var personSchema = Schema({
_id: Schema.Types.ObjectId,
name: String,
age: Number,
stories: [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});
var storySchema = Schema({
author: { type: Schema.Types.ObjectId, ref: 'Person' },
title: String,
fans: [{ type: Schema.Types.ObjectId, ref: 'Person' }]
});
var Story = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);
(конец схем)
var author = new Person({
_id: new mongoose.Types.ObjectId(),
name: 'Ian Fleming',
age: 50
});
author.save(function (err) {
if (err) return handleError(err);
var story1 = new Story({
title: 'Casino Royale',
author: author._id // assign the _id from the person
});
story1.save(function (err) {
if (err) return handleError(err);
// thats it!
});
});
Когда вы запускаете этот код, он генерирует это в mongo:
db.people.find()
{ "_id" : ObjectId("5be0a37f1dd61a343115e2c8"), "stories" : [ ], "name" : "Ian Fleming", "age" : 50, "__v" : 0 }
db.stories.find()
{ "_id" : ObjectId("5be0a37f1dd61a343115e2c9"), "title" : "Casino Royale", "author" : ObjectId("5be0a37f1dd61a343115e2c8"), "__v" : 0 }
Похоже, что он не хранит никаких идентификаторов в коллекции людей в «историях». Разве вы не хотели бы сохранить идентификаторы историй в коллекции людей?
Я попытался изменить код, чтобы он работал (переместил функцию сохранения автора, пока не будет установлен идентификатор истории):
var author = new Person({
_id: new mongoose.Types.ObjectId(),
name: 'Ian Fleming',
age: 50
});
var story1 = new Story({
_id: new mongoose.Types.ObjectId(),
title: 'Casino Royale',
author: author._id // assign the _id from the person
});
author.stories = story1._id;
author.save(function (err) {
if (err) return handleError(err);
story1.save(function (err) {
if (err) return handleError(err);
// thats it!
});
Это дает мне неопределенного автора.





Mongo не будет автоматически добавлять в поле Person "stories" только потому, что вы добавили объект Story.
В любом случае вам действительно не нужно хранить идентификаторы историй в объектах Person, так как вы всегда можете получить список историй от автора с помощью
db.stories.find({author: <id>})
Хранение в обоих местах создаст избыточную информацию, и вам нужно будет выбрать одно, чтобы быть правдой в случае несоответствия. Мне кажется, лучше не дублировать.
ОБНОВИТЬ:
Ссылки появляются, чтобы помочь вам автоматически заполнять ссылочные поля в запросах. Согласно эта почта вы можете получить автора и его истории следующим образом:
db.persons.find({_id: <id>}).populate('stories')
Не использовал лично, но выглядит очень удобно.
Документы Mongoose для заполнения: https://mongoosejs.com/docs/populate.html
Возможно, здесь объясняется, что делают «они»: stackoverflow.com/questions/18001478/…
В этом есть смысл ... они действительно включают свойство "stories" в схему Person. Интересно, это просто для справки (без каламбура) и в данном конкретном случае это вообще не нужно. Я добавлю их схему к вопросу.