使用mongodb(mongoose)中的默认值来处理缺少的属性

时间:2017-01-25 11:57:01

标签: node.js mongodb mongoose mongoose-schema

我正在使用mongoose Schemas为我的mongodb创建模型,我想知道是否使用默认值。我知道使用默认值对于createdAt和类似的值是有好处的,但在我的情况下,我有一堆属性的模式,这可能会导致客户端中的大量空指针。我应该使用我的mongoose架构上的默认值来解决这个问题,还是应该在客户端,甚至nodejs处理这个问题?

1 个答案:

答案 0 :(得分:1)

我的答案就是避免在架构字段未使用时使用默认值。在我的生产Node / Mongo / Mongoose应用程序中,有很多要点可以帮助我们制定一个好的策略:

  • Mongoose不保存未使用的字段,即在模式中没有默认值且在创建操作期间未设置的字段。这节省了大量的Mongo磁盘空间,因为每个Mongo文档都将字段名称和值存储在JSON文档中。通过使用短字段名称和避免不必要的默认值,我已经看到磁盘空间增加了60%。
  • 当您在NodeJS中编写通过Mongoose查询处理数据库的代码时,您将获得可以处理架构属性存在/不存在的Mongoose装饰对象,即使未设置。请注意,如果您执行 model.find()操作,这是默认行为。至于后端代码,您不必担心处理Javascript未定义的异常。 Mongoose将帮助设置在模式中声明的任何属性,并且它也会相反地忽略(而不是序列化到数据库)您添加的任何未声明的属性。
  • 请注意,上述功能昂贵用于查询。 底线:如果您在执行创建或更新方法时在NodeJS中编写代码来获取/设置道具,则使用Mongoose装饰的对象将处理架构默认值等。如果您只是查询发送数据回到前端(按原样),你应该在Mongoose查询中使用 .lean()方法 - 它们明显更快。
  • 在前端,没有值但需要默认值的字段可以很容易地处理 - 深度为1级的属性:

    var someField = myMongoDoc.attrWithoutDefault || 'default value';
    
  • 嵌套的属性(例如myMongoDoc.attr1.subAttr1)可以使用像lodash这样的库进行测试(参见https://lodash.com/docs#get