【问题标题】:relations in mongoose with custom field猫鼬与自定义字段的关系
【发布时间】:2014-02-23 11:04:27
【问题描述】:

我见过很多关于猫鼬和关系的例子,但是我怎样才能在自定义字段中创建对另一个实体的引用呢?

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。如果这是正确的方法,我只是不这样做。

【问题讨论】:

标签: node.js mongoose


【解决方案1】:

不,你不能。 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' }
}));

【讨论】:

  • 这是一个好习惯吗?
【解决方案2】:

Mongoose 4.5 开始支持此功能,称为 virtuals population

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

【讨论】:

    【解决方案3】:

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

    然后,您可以通过保存book.author = authorbook.author = author._idAuthor 保存为Book 对象的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

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2022-01-14
      • 2018-01-21
      • 2023-03-19
      相关资源
      最近更新 更多