使用 mongodb (mongoose) 中的默认值来处理缺失的属性
Using default values in mongodb (mongoose) to deal with missing properties
我正在使用猫鼬模式为我的 mongodb 创建模型,我想知道是否使用默认值。我知道使用默认值对 createdAt 和类似值有好处,但在我的情况下,我有带有一堆属性的模式,这可能会导致客户端中出现大量空指针。我应该在我的 mongoose 模式上使用默认值来解决这个问题,还是应该在客户端甚至 nodejs 上处理这个问题?
我的回答是简单地避免在模式字段未使用时使用默认值。在我的生产 Node/Mongo/Mongoose 应用程序中,有许多要点有助于使它成为一个好的策略:
- Mongoose 不保存未使用的字段,即那些在模式中没有默认值并且在创建操作期间未设置的字段。这节省了大量 Mongo 磁盘 space,因为每个 Mongo 文档都将字段名称和值存储在 JSON 文档中。通过使用短字段名称和避免 un-necessary 默认值,我发现磁盘 space 增加了 60%。
- 当您在 NodeJS 中编写通过 Mongoose 查询处理数据库的代码时,您会得到 Mongoose-decorated 可以处理模式属性存在/不存在的对象,即使未设置。请注意,如果您执行 model.find() 操作,这是默认行为。至于 back-end 代码,您无需担心处理 Javascript 未定义的异常。 Mongoose 将帮助设置在模式中声明的任何属性,它也会反过来忽略(并且不序列化到数据库)您添加的任何未声明的属性。
- 请注意,上述功能对于查询来说昂贵。 底线:如果您在执行创建或更新方法时在 NodeJS 中将代码写入 get/set 道具,则使用 Mongoose-decorated 对象将处理架构默认值等。如果您只是查询将数据发送回 front-end(按原样),您 应该 使用 .lean() 方法您的 Mongoose 查询 - 它们明显更快。
在 front-end 中,没有值但需要默认值的字段可以很容易地处理 - 1 级深的属性:
var someField = myMongoDoc.attrWithoutDefault || 'default value';
嵌套的属性(例如 myMongoDoc.attr1.subAttr1)可以使用像 lodash 这样的库进行测试(参见 https://lodash.com/docs#get)
我正在使用猫鼬模式为我的 mongodb 创建模型,我想知道是否使用默认值。我知道使用默认值对 createdAt 和类似值有好处,但在我的情况下,我有带有一堆属性的模式,这可能会导致客户端中出现大量空指针。我应该在我的 mongoose 模式上使用默认值来解决这个问题,还是应该在客户端甚至 nodejs 上处理这个问题?
我的回答是简单地避免在模式字段未使用时使用默认值。在我的生产 Node/Mongo/Mongoose 应用程序中,有许多要点有助于使它成为一个好的策略:
- Mongoose 不保存未使用的字段,即那些在模式中没有默认值并且在创建操作期间未设置的字段。这节省了大量 Mongo 磁盘 space,因为每个 Mongo 文档都将字段名称和值存储在 JSON 文档中。通过使用短字段名称和避免 un-necessary 默认值,我发现磁盘 space 增加了 60%。
- 当您在 NodeJS 中编写通过 Mongoose 查询处理数据库的代码时,您会得到 Mongoose-decorated 可以处理模式属性存在/不存在的对象,即使未设置。请注意,如果您执行 model.find() 操作,这是默认行为。至于 back-end 代码,您无需担心处理 Javascript 未定义的异常。 Mongoose 将帮助设置在模式中声明的任何属性,它也会反过来忽略(并且不序列化到数据库)您添加的任何未声明的属性。
- 请注意,上述功能对于查询来说昂贵。 底线:如果您在执行创建或更新方法时在 NodeJS 中将代码写入 get/set 道具,则使用 Mongoose-decorated 对象将处理架构默认值等。如果您只是查询将数据发送回 front-end(按原样),您 应该 使用 .lean() 方法您的 Mongoose 查询 - 它们明显更快。
在 front-end 中,没有值但需要默认值的字段可以很容易地处理 - 1 级深的属性:
var someField = myMongoDoc.attrWithoutDefault || 'default value';
嵌套的属性(例如 myMongoDoc.attr1.subAttr1)可以使用像 lodash 这样的库进行测试(参见 https://lodash.com/docs#get)