• 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);

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

  • 相关阅读:
    Java知识之运算符篇
    对List取交集、联集及差集
    SQL in与exists的执行效率比较
    SQLServer数据集合的交、并、差三种集合运算
    获取外网IP
    SQL语句优化技术分析
    高并发下的获取ID解决方案
    获取数据库里面所有自增类型的最大值
    锁的概述
    项目管理心得:一个项目经理的个人体会、经验总结(转)
  • 原文地址:https://www.cnblogs.com/baiyunchen/p/5718074.html
Copyright © 2020-2023  润新知