我正在使用Mongoose模型和参考。我一直在使用猫鼬网站上的代码,其中讨论了填充方法和引用。我试图让它在两个模型中保存各自的“引用” ID。它仅将参考ID保存在故事模型中。这是代码:
更新:在顶部添加了架构以提供帮助:
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 }
似乎没有在“故事”中的人员集合中存储任何ID。您是否也不想将故事ID保存在人员集合中?
我试图修改代码以使其能够使用(移动了作者保存功能,直到设置了故事ID之后):
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!
});
这给我一个未定义的作者。
答案 0 :(得分:0)
Mongo不会仅仅因为您添加了Story对象而自动添加到“人物”“ stories”字段。
您实际上并不需要将故事ID存储在Person对象中,因为您始终可以使用
获取作者的故事列表。db.stories.find({author: <id>})
在两个地方都存储会创建多余的信息,如果不匹配,您必须选择一个事实。最好不要重复,methinks。
更新:
出现引用可以帮助您自动填充查询中的引用字段。根据{{3}},您可以像这样检索作者及其故事:
db.persons.find({_id: <id>}).populate('stories')
还没有亲自使用过,但是看起来很方便。
用于填充的猫鼬文档:this post