smallnewer / bugs

18 stars 4 forks source link

mongodb默认值不要设置为空对象 #57

Open smallnewer opened 9 years ago

smallnewer commented 9 years ago

在mongoose中有个配置属性是 minimize,用法:

schema.set('toObject', { minimize: false });

mongoose把每个文档用自家的document类封装了一下,提供了一些方便的接口(当然有些也有隐性问题),有时我们需要把document转换成JS原生对象,就要调用toObject方法。 此时就会出现一个问题,如果一个字段是空对象或空数组,toObject方法就会把它删掉(据说是之前mongodb不能存空对象?不管什么原因,这么做好坑。),这个过程被叫做minimize。 我们设置其为false,就可以屏蔽这个过程。

然而最近发现另外一个问题,就是当我们用create、save流程去创建并保存一个文档时,即便设置了minimize为false,仍然会过滤掉空对象。这对我们在schema中设置默认值空对象是非常不利的。

还没研究有没有相关配置,好在用upsert方法可以避免。

        var handle = yield model.$findOneAndUpdate({
        _id: uid
    }, {
        $set: {
            _id: uid
        },
        $setOnInsert: model.$getOnInsertData('-_id')
    }, {
        new: true,
        upsert: true
    })

// 其中$getOnInsertData大约做了如下事情:
// 1. (this.create({})).toObject();创建一个完整、隔离的文档
// 2. 把本次修改的字段从文档中删除