【问题标题】:Importing a model schema as a subdocument将模型模式作为子文档导入
【发布时间】:2016-12-29 15:00:30
【问题描述】:

我有 2 个独立的模型:

models/day.js:

var mongoose = require ('mongoose');
var Schema = mongoose.Schema;
var shiftSchema = require('./shift').shiftSchema;

var daySchema = new Schema({
    date: {
        type: String,
        required: true
    },
    shifts: [shiftSchema]
});
module.exports = {
     model: mongoose.model('Day', daySchema)
};

models/shift.js:

var mongoose = require ('mongoose');
var Schema = mongoose.Schema;

var shift_status_enum = {
  values: ['open', 'closed'],
  message: '`{VALUE}` is not a valid shift status.'
};
var shiftSchema = new Schema({
    start: {
        type: Number,
        required: true
    },
    end: {
        type: Number,
        required: true
    },
    status: {
        type: String,
        enum: shift_status_enum,
        required: true,
        default: 'open'
    }
});
shiftSchema.pre('save', function(next) {
    if (this.start >= this.end)
        return next(Error('error: Shift end must be greater than shift start.'));
    if(this.interval > this.end - this.start)
        return next(Error('error: Shift interval cannot be longer than the shift.'));
    else
        next();
});
module.exports = {
     model: mongoose.model('Shift', shiftSchema)
};

我正在尝试将shifts 的数组嵌入到day 中,如上所示。但是,当我尝试在 daySchema 中引用 shiftSchema 时,出现错误:

TypeError: Invalid value for schema Array pathshifts``。 但是,当我尝试将shiftSchema 复制到同一个文件中时,它起作用了。是否可以在不将子架构与父架构放在同一个文件中的情况下引用子架构(及其所有验证),还是它们必须在同一个文件中?

【问题讨论】:

    标签: mongoose mongoose-schema


    【解决方案1】:

    基本上,您正在合并子文档和文档的概念。在上面给定的模型中,您正在创建两个文档,然后将一个文档插入另一个文档。

    我们怎么能说您正在将文档导出到文档而不是子文档?

    Ans:导出这行代码mongoose.model('Shift', shiftSchema) 使其成为完整的文档

    如果您只导出module.exports = shiftSchema,那么您可以实现您想要做的事情。

    所以,在我看来,您可以像这样重组 daySchema:

    var daySchema = new Schema({
        date: {
            type: String,
            required: true
        },
        shifts: [Schema.Types.ObjectId]
    });
    

    shifts 将包含班次文档的 objectIds 数组。我个人觉得这种方法更好,但如果你想让你的代码运行,那就去吧:

    var mongoose = require ('mongoose');
    var Schema = mongoose.Schema;
    var shiftSchema = require('./shift');
    
    var daySchema = new Schema({
        date: {
            type: String,
            required: true
        },
        shifts: [shiftSchema]
    });
    module.exports = {
         model: mongoose.model('Day', daySchema)
    };
    

    模型/shift.js:

        var mongoose = require ('mongoose');
        var Schema = mongoose.Schema;
    
        var shift_status_enum = {
          values: ['open', 'closed'],
          message: '`{VALUE}` is not a valid shift status.'
        };
        var shiftSchema = new Schema({
            start: {
                type: Number,
                required: true
            },
            end: {
                type: Number,
                required: true
            },
            status: {
                type: String,
                enum: shift_status_enum,
                required: true,
                default: 'open'
            }
        });
    module.exports = shiftSchema
    

    【讨论】:

    • 您对导出shift 架构是正确的!我只是导出模型。但是将shifts: [shiftSchema] 更改为shifts: [Schema.Types.ObjectId] 会导致错误。您可以编辑答案以仅包含 module.exports = shiftSchema 更改以便我可以接受答案吗?谢谢!
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多