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 = authorbook.author = author._idauthor保存为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; }); 

参考文献:

http://mongoosejs.com/docs/populate.html