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

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

 

posted @ 2016-07-29 13:40  人生无赖  阅读(2114)  评论(0编辑  收藏  举报