mongoose与自定义字段的关系
我见过很多关于mongoose和关系的例子,但是我怎样才能创build一个到另一个实体的引用到一个自定义字段?
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); mongoose.connection.once('open', function(){ var Author = m.model('Author', new m.Schema({ name: String, slugname: String })); var Book = m.model('Book', new m.Schema({ title: String, author: {type: String, ref: 'Author.slugname'} })); });
在上面的代码中,我将Book.author链接到Author.slugname。 如果这是正确的做法,我不这样做。
不,你不能。 mongoose总是使用_id
字段链接文档。 但…
您可以使用任何您想要的数据types为每个文档设置自己的_id
。 只有两个限制:
- 它应该是独一无二的
- 它在文档的生命周期中不应该被改变
所以,而不是添加新的slugname
字段,使用作者的_id
作为一个slugname:
var Author = m.model('Author', new m.Schema({ _id: String, // <-- slugname name: String })); var Book = m.model('Book', new m.Schema({ title: String, author: { type: String, ref: 'Author' } }));
这是从Mongoose 4.5开始支持的,被称为虚拟人口 。
检查我的详细答案(几乎重复)的问题 。
mongoose被设置更多的直接对象关系。 而不是将您的Book
对象链接到Author
对象的slug,最好链接到由Mongoose自动创build的作者的_id
属性。
var Author = mongoose.model('Author', new mongoose.Schema({ name: String }); var Book = mongoose.model('Book', new mongoose.Schema({ title: String author: { type: mongoose.Schema.Types.ObjectId, ref: 'Author' } });
然后,您可以通过保存book.author = author
或book.author = author._id
将author
保存为Book
对象的book.author = author
。 当保存时,Mongoose会自动序列化数据。
var author = new Author(); author.name = 'Hank Brekke'; var book = new Book(); book.title = 'My Book'; book.author = author; book.save();
当拉取书对象时,可以让Mongoose自动填充author
属性,默认情况下它不会在调用.exec()
之前添加.populate('author')
修饰符。
Book.findOne({ /* query */}).populate('author').exec(function(error, book) { var author = book.author; });