【问题标题】:Importing a custom mongoose schema in another schema在另一个模式中导入自定义猫鼬模式
【发布时间】:2019-01-24 02:14:55
【问题描述】:

我的软件有一个猫鼬模式,我们称之为carSchema,我正在导出一个名为CarcarSchema 模型。示例:

/* Car.js */
var carSchema= new Schema({
    _id: Schema.Types.ObjectId,
    type: String,
    wheels: Number
});

carSchema.statics.drive = async function(){
    ...
}

module.exports = mongoose.model('Car', carSchema);

现在假设我的软件在另一个文件中有另一个名为 lotSchema 的架构,其中使用了 carSchema:

/* Lot.js */
var lotSchema = new Schema({
    _id: Schema.Types.ObjectId,
    carArr: [carSchema]
});

lotSchema.statics.getAllId = async function(){
    return carSchema[0]['_id']
}

如何正确导入或导出carSchema 以用于lotSchema?一个简单的const carSchema = require('Car.js') 就足够了吗?

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    如果你不使用不使用 es6/7 那么你可以这样做

     /* Car.js */
        const carSchema= new Schema({
            _id: Schema.Types.ObjectId,
            type: String,
            wheels: Number
        });
    
        carSchema.statics.drive = async function(){
            ...
        }
        module.exports.carSchema = carSchema;
    
        module.exports.carModel = mongoose.model('Car', carSchema);
    
    
    
    
    
     /* Lot.js */
        const { carSchema , carModel } = require('./Car.js');
        var lotSchema = new Schema({
            _id: Schema.Types.ObjectId,
            carArr: [carSchema]
        });
    
        lotSchema.statics.getAllId = async function(){
            return carSchema[0]['_id']
        }
    

    【讨论】:

    • 啊,所以如果我只需要carModel,我可以在其他地方做const { carModel } = require('./Car.js) 吗?
    • @albert 是的,如果您不需要不需要导入它的架构,这是正确的。
    【解决方案2】:

    你可以在 Car.js 中做到这一点

    module.exports = {
      useCarSchema: function(myCollection) {
        return mongoose.model('Car', carSchema, myCollection);
      }
    }
    

    这在 Lot.js 中

    var carSchema     = require('./Car.js');
    var Car =  carSchema.useCarSchema(myCollection);
    

    【讨论】:

    • 这与module.export = mongoose.model('Car', carSchema)var Car = require('./Car.js') 有什么不同吗?
    • 如果您只想导出mongoose.model('Car', carSchema); 而没有别的,我想不会有什么不同。我正在考虑一种允许您导出多个功能的方法,您可能会或可能不想在某些时候这样做。
    • 如果我将这些函数编写为模式的静态方法会怎样,即carSchema.static.drive = function(){...}。该 carSchema 的导出/要求在技术上仍然可以使用该功能,对吗?还是这是不好的做法?
    【解决方案3】:

    你可以使用Populate:

    填充是自动替换指定的过程 文档中的路径以及来自其他集合的文档。我们 可以填充单个文档、多个文档、普通对象、 多个普通对象,或从查询返回的所有对象。

    例子:

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    const carSchema= new Schema({
        _id: Schema.Types.ObjectId,
        type: String,
        wheels: Number
    });
    
    const lotSchema = new Schema({
        _id: Schema.Types.ObjectId,
        cars: [{ type: Schema.Types.ObjectId, ref: 'Car' }]
    });
    
    mongoose.model('Car', carSchema);
    mongoose.model('Lot', lotSchema);
    

    现在,要填充作品,您首先需要创建一个汽车对象car = new Car({}) 和一个停车场对象lot = new Lot({}),然后:

    lot.cars.push(car);
    lot.save(callback); 
    

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 2020-12-16
      • 2013-09-22
      • 1970-01-01
      • 2015-05-15
      • 2017-11-20
      • 2021-08-17
      • 2013-03-22
      • 2015-11-08
      相关资源
      最近更新 更多