我已经看过很多关于猫鼬和关系的例子,但是如何创建对另一个实体的引用到自定义字段?
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。只是我不知道这是否是正确的方法。
答案 0 :(得分:3)
_id
字段来链接文档。但...
您可以使用所需的任何数据类型为每个文档设置自己的_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' }
}));
答案 1 :(得分:1)
支持 Mongoose 4.5 ,并且称为 virtuals population 。
答案 2 :(得分:0)
Mongoose更多地用于直接对象关系。不是将Book
对象链接到Author
对象的slug,而是更适合链接到Mongoose自动创建的作者_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' }
});
然后,您可以通过保存Author
或author
将Book
保存为book.author = author
对象的book.author = author._id
。 Mongoose会在保存时自动序列化数据。
var author = new Author();
author.name = 'Hank Brekke';
var book = new Book();
book.title = 'My Book';
book.author = author;
book.save();
拉动书籍对象时,您可以让Mongoose自动填充author
属性,默认情况下不会,在调用.populate('author')
之前添加.exec()
修饰符
Book.findOne({ /* query */}).populate('author').exec(function(error, book) {
var author = book.author;
});