【问题标题】:Mongoose Schema Embedded Document DefaultMongoose Schema 嵌入文档默认
【发布时间】:2015-09-14 13:07:31
【问题描述】:

我正在尝试将一个文档(我猜是一个子文档)嵌入到 Mongoose 架构中。我一直在遵循Mongoose documentation 建议的这种模式。我的架构如下所示。

var CategoriesSchema = new Schema({
    name: { type: String, required: true, default: 'default' }
});

var PostSchmea = new Schema({
    title: { type: String, required: true, default: 'default title' },
    writtenBy: { type: ObjectId, required: true, default: '55878003ebf4b06110ef2ff8' },
    publishedOn: { type: Date, default: Date.now },
    updatedOn: Date,
    published: { type: Boolean, required: true, default: false },
    content: { type: String, required: true, default: 'empty' },
    category: { type: [CategoriesSchema] },
    tags: [String],
    images: [String]
});

如您所见,我将 CategoriesSchema 嵌入到 PostSchema 中。我的问题是如何为 PostSchema 中的类别键设置默认值。我尝试了以下并得到错误“TypeError:无法读取未定义的属性'$__'”:

var PostSchmea = new Schema({
    title: { type: String, required: true, default: 'default title' },
    writtenBy: { type: ObjectId, required: true, default: '55878003ebf4b06110ef2ff8' },
    publishedOn: { type: Date, default: Date.now },
    updatedOn: Date,
    published: { type: Boolean, required: true, default: false },
    content: { type: String, required: true, default: 'empty' },
    category: { type: [CategoriesSchema], default: [CategoriesSchema] },
    tags: [String],
    images: [String]
});

我还尝试了以下方法,得到了错误“SyntaxError: Unexpected token”:

var PostSchmea = new Schema({
    title: { type: String, required: true, default: 'default title' },
    writtenBy: { type: ObjectId, required: true, default: '55878003ebf4b06110ef2ff8' },
    publishedOn: { type: Date, default: Date.now },
    updatedOn: Date,
    published: { type: Boolean, required: true, default: false },
    content: { type: String, required: true, default: 'empty' },
    category: { type: [CategoriesSchema], default: new CategoriesSchema(name: "default") },
    tags: [String],
    images: [String]
});

任何建议或文档将不胜感激。

谢谢,

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我相信问题可能在于您的依赖声明。我使用你的代码来声明猫鼬模式,它工作正常,但是你没有包含你的依赖项或你的创建方法,所以让我向你展示我是如何创建记录的,希望对你有所帮助。您还可以参考此 Stack Overflow 答案以获取 ObjectId 的依赖声明:How to set ObjectId as a data type in mongoose

    这是我的代码:

    //contents of stackoverflow.js
    var mongoose = require('mongoose'),
    Schema = mongoose.Schema;
    var ObjectId = Schema.ObjectId;
    
    var CategoriesSchema = new Schema({
        name: { type: String, required: true, default: 'default' }
    });
    
    
    var PostSchmea = new Schema({
       title: { type: String, required: true, default: 'default title' },
       writtenBy: { type: ObjectId, required: true, default:     '55878003ebf4b06110ef2ff8' },
       publishedOn: { type: Date, default: Date.now },
       updatedOn: Date,
       published: { type: Boolean, required: true, default: false },
       content: { type: String, required: true, default: 'empty' },
       category: { type: [CategoriesSchema], default: [CategoriesSchema] },
       tags: [String],
       images: [String]
    });
    
    mongoose.model('Post', PostSchmea);
    mongoose.model('Categories',CategoriesSchema);
    

    然后我在 server.js 文件中声明了模式和模型以运行代码并创建记录:

    //contents of my server.js file (or wherever you put your controllers)    
    var stack = require('./app/models/stackoverflow'),
    post = mongoose.model('Post');
    
    var v = new post({
      //Define your values here
    });
    
    v.save(function(err,docs) {
    if (err) {
       console.log(err)
    
    } else {
      console.log(docs)
    }
    });
    

    这成功创建了具有所有已定义默认值的记录。希望对您有所帮助。

    【讨论】:

    • 感谢您的回答!我将对此进行测试,如果它有效,我会告诉你。再次感谢!
    • 这在 mongoose 4+ 中不起作用。存在嵌入文档无法识别父级的问题
    猜你喜欢
    • 2016-05-31
    • 2015-11-26
    • 2020-09-15
    • 2021-05-06
    • 2015-07-17
    • 2012-02-18
    • 2012-08-26
    • 2014-06-12
    • 2023-03-10
    相关资源
    最近更新 更多