node.js - ref 是什么意思 mongooose
问题描述
我正在阅读 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 有 ref,它的类型是 objectId,它如何存储整个模式(_id、name、age、stories)和故事属性一样,它如何存储整个模式(在猫鼬语言“文档”中)。
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"
});
在这里,当我分析此代码时,会在故事模型中找到标题字段,然后它也会在故事模型中获取作者属性,然后从第二个模式中获取名称。如代码所示,作者引用了人模型,但我承认它的类型是 objectId,它如何存储整个模式(_id、名称、年龄、故事)
如果有人可以更详细地解释这一点,他们将帮助许多像我一样没有得到它的人
解决方案
ref
基本上意味着mongoose
它将存储ObjectId
值,并且当您populate
使用这些 ObjectIds 调用时会为您获取并填写文档。所以在这种情况下:
stories: [{ type: Schema.Types.ObjectId, ref: 'Story' }]
一个ObjectId
for Story 将只存储在Person stories
数组中,当您调用populate('stories')
mongoose 时,它会进行另一个查询以查找和匹配所有对象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);
});
希望这可以帮助。
推荐阅读
- javascript - Ink CLI 预期的组件是一个函数
- excel-formula - Excel MIN 和 MAX 函数在工作表中不一致
- php - PHP/MYSQL - 在 for 循环中只生成一个随机词
- sql - 选择连接表使用的最大行数 最大行差异 其他
- php - 使用处理表单时如何解决 Ajax 的重定向问题
- bots - Bot Framework Emulator 错误:POST 500 directline postActivity
- java - 如何防止 IntelliJ 删除导入语句
- c++ - Retrieve used header and source file names by parsing Makefile
- c++ - 在 Clang 中生成默认构造函数
- ruby-on-rails - Rails 单选按钮参数是字符串而不是哈希