ref代表猫鼬是什么意思

时间:2018-12-11 17:35:48

标签: node.js mongoose

我正在阅读mongoosejs文档,并使用填充方法并使用'ref'进行填充有点难以理解,因为我也看到了许多stackoverflow问题,MDN但没人花很多时间来解释

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);

所以这是一个示例,文档说的是ref:引用了我们应该使用的模型,但是在这种情况下,作者引用了person,它的类型是objectId以及如何存储整个模式(_id,name,age ,stories)和stories属性相同,如何存储整个模式(以猫鼬语言“ document”表示)。

Story.
findOne({ title: 'Casino Royale' }).
populate('author').
exec(function (err, story) {
if (err) return handleError(err);
console.log('The author is %s', story.author.name);
// prints "The author is Ian Fleming"
});

在这里,当我分析此代码时,在故事模型中找到标题字段,然后它也在故事模型中获得author属性,然后从第二个架构中获取名称。如代码所示,作者引用了人模型,但我承认它的类型是objectId,它如何存储整个模式(_id,名称,年龄,故事)

如果有人可以在其中解释  更多详细信息,它们将帮助许多像我这样的人

1 个答案:

答案 0 :(得分:0)

ref基本上意味着mongoose将存储ObjectId值,并且当您使用这些ObjectId调用populate时将为您获取并填充文档。因此,在这种情况下:

stories: [{ type: Schema.Types.ObjectId, ref: 'Story' }]

故事的ObjectId仅存储在 stories数组中,当您调用populate('stories')时,猫鼬会去执行另一个查询以找到并匹配所有ObjectId,然后返回实际的Stories对象。

所以ref只是告诉猫鼬您要在其中存储对另一个模型的引用,而在某个时候您要populate那些,并通过该引用获得完整的模型。

从某种意义上说,它不过是另一个集合的foreign键,您可以在调用populate时通过该键获取实际文档。

以下是细分的代码:

Story.findOne({ title: 'Casino Royale' })  // <-- filter on title
  // once a story is found populate its `author` with full author document 
  // instead of the `ObjectId` stored by the `ref`
  .populate('author')
  // execute the current pipeline
  .exec(function (err, story) { // handle the resulting record
    if (err) return handleError(err);
      console.log('The author is %s', story.author.name);
    });

希望这会有所帮助。