• Mongoose 对象的特殊性


    一、偶遇难题

    在最近使用Mongoose的时候,遇到这样一个问题:

    我从DB中查询出来一个对象,比如是Book,这个对象我想在返回时,给他附加一个字段,比如是字段A,正常来说,JS你只需要Book.A=Value,然后直接返回就是了,但是我在使用Mongoose的时候,无论如何,这个字段都不会被返回,但他也没有报错,搞得我都有点怀疑人生了。

    二、万能的同事

    几经周折,同事告知可能与Mongoose有关,他在Model中可以配置一些东西,比如:

    {
            strict: true,
            toObject: {
                virtuals: true
            },
            toJSON: {
                virtuals: true
            }
        }

    解释一下这里面的几行代码,

    第一句:strict,严格模式,用来配置在存入数据库时,是否严格按照模型所约定的字段来,如果设置为false,则模型定义之外的字段也可以被存储。

    第二句:toObject,在toObject时的一些配置,比如virtuals:true就表示virtulas字段也可以被转换到新的对象中

    第三句与第二句差不多,是配置在转换成为json时候的一些配置。

    这里如果你想研究toObject和toJson时的更多配置,可以查看官方文档:http://mongoosejs.com/docs/api.html#document_Document-toObject

    这里的可配置项还有:

    • getters 输出所有字段和virtual字段
    • virtuals 设置virtual的输出,可以覆盖掉getters的配置
    • minimize 在输出时删掉里面的空字段,默认为true
    • transform 在转换之前,可以利用这个方法做点想做的事情
    • depopulate 这个貌似是如果有外键关联过的,把关联的对象只保留一个id,默认为false
    • versionKey 版本号,这个应该是并发控制里面用的,没有实际测试
    • retainKeyOrder输出的顺序是否按所配置的key来,如果你对顺序有要求,那可以事先配置一下key,配置方法:Object.keys(new Doc({ a: 1, b: 2}).toObject())

    三、解决问题

    不过这个配置并不能解决我们的问题,但是回头想想,他既然提供一个toObject方法,那就说明他这个对象不是一个标准的javascript对象,那我们把他toObject之后,然后再去加一些自己想要的属性上去,最终序列化出去,不就完事儿了吗?

    最终的代码类似于:

     var model = obj.toObject();
     model.isBorrow = false;
    cb(null, model);

    果然,最终解决了这个问题。

  • 相关阅读:
    2019最新windows 10永久激活码 win10专业版密钥 win10通用序列号
    安装Office2016遇到“无法流式传输Office”问题
    windows cannot find powershell.exe windows 7
    AI illustrator 如何裁剪图片(扣取局部区域)
    64位 windows2008 R2 上安装32位oracle 10g 的方法
    计算器进行进制数之间的换算
    Linux服务器上监控网络带宽的18个常用命令
    iOS 如何判断一个点在圆、方框、三角形区域内?
    CircularSlider半弧形滑动条
    iOS圆弧渐变进度条的实现
  • 原文地址:https://www.cnblogs.com/baiyunchen/p/5718074.html
Copyright © 2020-2023  润新知