首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongoose向上插入不会创建默认架构属性。

Mongoose向上插入不会创建默认架构属性。
EN

Stack Overflow用户
提问于 2014-09-10 00:25:35
回答 2查看 8.3K关注 0票数 23

示例文档模式:

代码语言:javascript
复制
var CompanySchema = Schema({
    created: { type: Date, default: Date.now },
    modified: { type: Date, default: Date.now },
    address: { type: String, required:true },
    name: { type: String, required:true }
});

我使用一个通用的请求处理程序来编辑和创建"Company“文档:

代码语言:javascript
复制
exports.upsert = function(req, res) {
    helper.sanitizeObject(req.body);
    var company = {
        name: req.body.name,
        address: req.body.address
    };
    var id = req.body.id || new mongoose.Types.ObjectId();
    var queryOptions = {
        upsert: true
    };
    Company.findByIdAndUpdate(id, company, queryOptions).exec(function(error, result) {
        if(!error) {
            helper.respondWithData(req, res, {
                data: result.toJSON()
            });
        } else {
            helper.respondWithError(req, res, helper.getORMError(error));
        }
    });
};

但是使用此方法时,当插入新文档时,createdmodified属性不会使用默认值Date.now保存。现在,我可以根据id的存在来调用Company.create,但是我想知道,如果新文档上不存在属性,为什么upsert不使用默认值呢?

我用的是猫鼬版本~3.8.10

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-10 14:15:42

所发生的事情是,在调用任何方法“更新”系列(如findByIdAndUpdate )时,都不使用Mongoose的验证、中间件或默认值。它们只通过调用savecreate来调用。

原因是"update“调用实际上是传递给本机驱动程序的,Mongoose只提供基于模式定义的字段类型转换。

Mongoose 4.0更新

猫鼬现在支持在updatefindOneAndUpdatefindByIdAndUpdate重新插入期间创建新文档时设置默认设置。将setDefaultsOnInsert选项设置为true以启用此选项。这将使用$setOnInsert运算符在insert上创建默认值。

代码语言:javascript
复制
var queryOptions = {
    upsert: true,
    setDefaultsOnInsert: true
};
Company.findByIdAndUpdate(id, company, queryOptions).exec( ...
票数 51
EN

Stack Overflow用户

发布于 2014-11-24 04:42:47

您可以使用{ "$setOnInsert": { value: 31 } } 文档

参考文献:https://groups.google.com/forum/#!topic/mongoose-orm/WuJSqxPX8T8

语法:findOneAndUpdate([query], [doc], [options], [callback]) 文档

示例:

代码语言:javascript
复制
model.findOneAndUpdate(
      { username: 'john' },
      { "$setOnInsert": { points: '0' },
            $push: {
            "boards": {
                "account":req.body.account,
                "game":req.body.game                                        
            }
        }          
      { upsert: true},
      function(err, doc) {    

      });
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25755521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档