猫鼬与自定义领域的关系

时间:2014-01-30 22:08:21

标签: node.js mongoose

我已经看过很多关于猫鼬和关系的例子,但是如何创建对另一个实体的引用到自定义字段?

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。只是我不知道这是否是正确的方法。

3 个答案:

答案 0 :(得分:3)

不,你不能。 Mongoose总是使用_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

检查my detailed answer on this (nearly duplicate) question

答案 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' }
});

然后,您可以通过保存AuthorauthorBook保存为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;
});

参考文献:

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