【问题标题】:Properties with default values in Mongoose schema are not persistingMongoose 模式中具有默认值的属性不会持久化
【发布时间】:2014-12-28 02:44:17
【问题描述】:

我使用 Mongoose 编写了以下架构:

var querySchema = mongoose.Schema({
    quoteId: { type: String, default: '' },
    zipcode: { type: String, default: '' },
    email: { type: String, default: '' },
    type: {type: String, default: ''},
    isEmailChecked: { type: Boolean, default: true },
});

我只为 querySchema 中的 3 个属性提供值,假设在持久化 query 对象的新实例时字段的结果将采用默认值:

var query = {};
query.quoteId = "1414775421426";
query.email = "myself@somewhere.com";
query.type = "Foo";

但以下文档是我在集合中看到的结果:

{
    "_id" : ObjectId("5453c27d0e4c3f2837071856"),
    "email" : "myself@somewhere.com",
    "type" : "Foo",
    "quoteId" : "1414775421426",
    "__v" : 0
}

query 对象的新实例被持久化到 MongoDB 数据库时,是否应该不为 isEmailCheckedzipcode 分配它们的默认值?

以下是我如何使用 ExpressJS/NodeJS 持久化查询对象的实例:

app.post('/api/queries', function (req, res) {
    QuoteQuery.create({
        quoteId: req.body.query.quoteId,
        type: req.body.query.type,
        zipcode: req.body.query.zipcode,
        email: req.body.query.email,
        isEmailChecked: req.body.query.isEmailChecked,
    }, function (err, query) {
        if (err) {
            res.send(err);
        }
        res.json(query);
    });
});

有人能帮我理解为什么我在 MongoDB 数据库的结果文档中获得了 isEmailCheckedzipcode 属性吗?

我在我的应用程序中使用 NodeJS、AngularJS 和 ExpressJS 以及 MongoDB。

【问题讨论】:

    标签: angularjs node.js mongodb express mongoose


    【解决方案1】:

    当你设置猫鼬模型字段时,它不使用默认值。

    作为解决方法,您可以使用下划线来扩展猫鼬模型对象,其中的键存在于您的 query 对象中,如下所示:

    _.extend(dbQueryObject, query);
    

    这里是完整的例子:

    var mongoose = require('mongoose');
    
    var querySchema = mongoose.Schema({
      quoteId: { type: String, default: '' },
      zipcode: { type: String, default: '' },
      email: { type: String, default: '' },
      type: {type: String, default: ''},
      isEmailChecked: { type: Boolean, default: true }
    });
    
    var db = mongoose.createConnection('mongodb://localhost:27017/stackoverflow',
      { server: { auto_reconnect: true } },
      function(err) {
        var QuerySchema = db.model('test', querySchema);
    
        var query = {};
        query.quoteId = "1414775421426";
        query.email = "myself@somewhere.com";
        query.type = "Foo";
    
        QuerySchema.create({
          quoteId: query.quoteId,
          type: query.type,
          zipcode: query.zipcode,
          email: query.email,
          isEmailChecked: query.isEmailChecked
        }, function (err, query) {
          process.exit(0);
        });
      });
    

    这是 db 中的内容:

    {
        "_id" : ObjectId("5453ce3c9f7e0d13c52abf61"),
        "type" : "Foo",
        "email" : "myself@somewhere.com",
        "quoteId" : "1414775421426",
        "__v" : 0
    }
    

    【讨论】:

    • 但是如果我在querySchema 中添加created: { type: Date, default: Date.now } 作为另一个属性并且没有在服务器端显式设置它,它会将Date.now 的默认值存储为created 属性新创建的query 实例。
    • 如果您在本地运行 express,如果您更改架构,请确保重新启动 - 对于查看此问题的其他人,上述 { type: Date, default: Date.now } 按预期工作并存储默认值。
    猜你喜欢
    • 2014-11-03
    • 2012-10-28
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多