在mongoose模式中使用字段类型的ObjectId是否可以

时间:2014-10-16 16:10:35

标签: mongodb mongoose schema

假设我将在mongodb中建立多对一的关系,

var mongoose = require('mongoose');
var Schema   = mongoose.Schema,
    ObjectID = Schema.Types.ObjectId;


var productSchema = new Schema({
   supplier: {
      _id: ObjectId,
      name: String
   }
});

我已阅读有关6 Rules of Thumb for MongoDB Schema Design的mongodb博客文章,并阅读:

  

当读取与更新的比率很高时,非规范化才有意义。如果您经常阅读非规范化数据,但很少更新

由于supplier不经常更新,我决定让它的名称为denormalize,但仍然有_id所以当我需要更新它时,我有一些东西要引用。

我决定使用ObjectId作为type,但如果它有效,我实际上没有测试过它,我已经想知道,如果我做得对,如果使用{ {1}}类型会更实用。

1 个答案:

答案 0 :(得分:2)

你肯定想在那里使用ObjectId,但也要定义一个ref来告诉Mongoose它所引用的模型,以便你可以在需要时使用Mongoose的引用population完整的供应商对象:

var productSchema = new Schema({
   supplier: {
      _id: { type: ObjectId, ref: 'Supplier' },
      name: String
   }
});

这使您可以执行以下操作:

Product.findById(id).populate('supplier._id').exec(err, product) {
    // product.supplier._id is the full Supplier doc instead of just the _id
});