【问题标题】:MongoDB empty string value vs null valueMongoDB空字符串值与空值
【发布时间】:2013-09-07 12:24:15
【问题描述】:

在 MongoDB 生产中,如果键的值为空或未提供(可选),我应该使用空字符串值还是应该使用 null 作为值。

1) 使用空字符串和空字符串之间有什么优缺点吗?

2) 如果我将 value 设置为 undefined 以从现有文档中删除属性,而不是将属性值设置为空字符串或 null,是否有任何利弊?

谢谢

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    我会说null 表示没有该值,而空字符串表示该值存在,但它是空的。 在读取数据时,您可以区分空白值和不存在的值。 仍然取决于您的用例

    【讨论】:

    • 感谢您的意见,@abhi!
    【解决方案2】:

    我认为最好的方法是未定义的,因为我建议不要完全包含这个键。 Mongo 不能像 SQL 一样工作,你必须在每列中至少有 null。如果您没有价值,则根本不包括密钥。然后,如果您对所有文档进行查询,如果该键不存在,它将正常工作,否则不会。此外,如果您不使用密钥,您可以节省一点磁盘空间。在 Mongo 中这样做是正确的方法。

    function deleteEmpty (v) {
       if(v==null){
         return undefined;
       }
       return v;
    }
    
    var UserSchema = new Schema({
    email: { type: String, set: deleteEmpty } 
    });
    

    【讨论】:

    • 在 mongo 模式中,如果在修剪或 null 后为空字符串,如何将其从文档中删除?我知道我可以将 trim: true 放入架构中,但我不知道如何在值为 null 或空字符串时自动删除。任何想法?谢谢
    • 我不完全明白你想要什么,但在这里试试stackoverflow.com/questions/12636938/…
    • 你知道在 Mongoose 中,我们可以在 schema 中定义一个 trim 函数来自动修剪值,例如:login: { required: true, trim: true },我想知道是否有是另一种类似的语法,如果 value 是空字符串或 null ,我可以使用它来自动将 value 设置为 undefined ?
    • 查看编辑,这是我唯一想到的。 PS,现在不能试,可能有错误
    • 请注意,如果您使用此 setter 的 trim 选项,您将收到以下错误:Cast to string failed for value "undefined" at path "XXXXX"
    【解决方案3】:

    这个问题我已经回答了至少 4 次,Google 搜索会为您提供大量信息。

    您必须考虑删除密钥的含义。如果您的文档最终将在应用程序中的大部分定义状态下使用该模式,那么您可能会看到文档的大量移动,这抵消了没有这些键的好处:空间。您将在空间中节省的那几个字节将变得无用,您将获得瑞士奶酪效果。

    但是,如果您根本不使用这些字段,那么在您的工作集中包含数百万个文档的那几个额外字节可能会导致不需要存在的实际问题(如果您出于某种原因想要将这么多文档推入您的工作集),至于空间问题,MongoDB 基本上存在空间问题,我真的不知道省略几个键来做任何事情来帮助解决这个问题。

    【讨论】:

    • 我确实使用了这些字段,这些字段是可选的。例如,工作电话字段,有些用户有工作#而有些人没有。因此,根据您的建议,如果 value 为空或 null,您建议不要在 doc 中包含 key,这将节省空间并总体上可以提高性能。
    • @NamNguyen 如果这些字段得到一致使用并且人们定期填写他们的信息,那么随着您掌握的信息的增长,您会看到性能下降
    • 我会再次提出这个问题,就像我在上面问@slezadave 一样,我们可以在模式中定义一个修剪函数来自动修剪值,例如:登录:{ required: true, trim: true } ,我想知道如果 value 是空字符串或 null ,是否还有另一种类似的语法可以用来将 value 自动设置为 undefined ?
    • @NamNguyen 这与 Mongoose 无关,这是 MongoDB 如何分配磁盘空间以及如何使用其填充因子的基础
    • @NamNguyen 虽然要实际回答您的最后一条评论,但我不知道节点中的函数我认为您可能需要在保存模型之前建立自己的事件
    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2023-03-17
    • 2022-12-09
    相关资源
    最近更新 更多