【发布时间】:2013-09-07 12:24:15
【问题描述】:
在 MongoDB 生产中,如果键的值为空或未提供(可选),我应该使用空字符串值还是应该使用 null 作为值。
1) 使用空字符串和空字符串之间有什么优缺点吗?
2) 如果我将 value 设置为 undefined 以从现有文档中删除属性,而不是将属性值设置为空字符串或 null,是否有任何利弊?
谢谢
【问题讨论】:
在 MongoDB 生产中,如果键的值为空或未提供(可选),我应该使用空字符串值还是应该使用 null 作为值。
1) 使用空字符串和空字符串之间有什么优缺点吗?
2) 如果我将 value 设置为 undefined 以从现有文档中删除属性,而不是将属性值设置为空字符串或 null,是否有任何利弊?
谢谢
【问题讨论】:
我会说null 表示没有该值,而空字符串表示该值存在,但它是空的。
在读取数据时,您可以区分空白值和不存在的值。
仍然取决于您的用例
【讨论】:
我认为最好的方法是未定义的,因为我建议不要完全包含这个键。 Mongo 不能像 SQL 一样工作,你必须在每列中至少有 null。如果您没有价值,则根本不包括密钥。然后,如果您对所有文档进行查询,如果该键不存在,它将正常工作,否则不会。此外,如果您不使用密钥,您可以节省一点磁盘空间。在 Mongo 中这样做是正确的方法。
function deleteEmpty (v) {
if(v==null){
return undefined;
}
return v;
}
var UserSchema = new Schema({
email: { type: String, set: deleteEmpty }
});
【讨论】:
Cast to string failed for value "undefined" at path "XXXXX"
这个问题我已经回答了至少 4 次,Google 搜索会为您提供大量信息。
您必须考虑删除密钥的含义。如果您的文档最终将在应用程序中的大部分定义状态下使用该模式,那么您可能会看到文档的大量移动,这抵消了没有这些键的好处:空间。您将在空间中节省的那几个字节将变得无用,您将获得瑞士奶酪效果。
但是,如果您根本不使用这些字段,那么在您的工作集中包含数百万个文档的那几个额外字节可能会导致不需要存在的实际问题(如果您出于某种原因想要将这么多文档推入您的工作集),至于空间问题,MongoDB 基本上存在空间问题,我真的不知道省略几个键来做任何事情来帮助解决这个问题。
【讨论】: