我正在存储诸如排名(管理员、版主、用户…)之类的枚举以及我的Mongo数据库中每个用户的成就.据我所知,Mongo没有枚举数据类型,这意味着我必须使用另一种类型来存储它.

我曾考虑过使用整数来存储它,我认为对于所有可以轻松表示为整数的内容,使用整数比存储字符串占用更少的空间.我看到使用整数的另一个好处是,如果我想重命名一项成就或排名,我可以轻松地更改它,甚至不必触碰数据库.我认为使用字符串的一个好处是,数据在使用前需要更少的处理,并且更易于人类阅读,这有助于跟踪错误.

有没有更好的方法在Mongo中存储枚举?是否有充分的理由使用整数或字符串?(试图避开一个更好的问题)

推荐答案

TL;DR:字符串可能是safer种 Select ,性能差异应该可以忽略不计.整数对于必须对枚举进行索引的大型集合是有意义的.YMMV.

我曾考虑过使用整数来存储它,我认为对于所有可以轻松表示为整数的内容,使用整数比存储字符串占用更少的空间

符合事实的

我看到使用整数的另一个好处是,如果我想重命名一项成就或排名,我可以轻松地更改它,甚至不必触碰数据库.

在我看来,这是整数的一个主要优点.但是,它还要求您确保enum的关联值不会更改.如果你搞砸了,你会受伤,这是一个巨大的劣势.

我认为使用字符串的一个好处是,数据在使用前需要更少的处理

如果您实际使用的是枚举数据类型,那么它在内部可能是某种整数,因此整数应该需要更少的处理.不管怎样,这种开销应该可以忽略不计.

是否有充分的理由使用整数或字符串?

我重复了很多已经说过的话,但这可能对其他读者有所帮助.总结:

  • 混合使用枚举值映射会造成严重 destruct .想象一下,你的Declined个状态突然被解释为Accepted,因为Declined的值为"2",而现在是Accepted,因为你重新排列了枚举的顺序,忘记了手动赋值...(shudders)
  • 弦更有表现力
  • 整数占用的空间更少.磁盘空间通常并不重要,但索引空间会消耗昂贵的RAM.
  • 整数更新不会调整对象的大小.如果字符串的长度变化很大,可能需要重新分配.不过,字符串填充和填充因子应该可以缓解这种情况.
  • 整数可以是标志(尚不可查询,不幸的是,请参见SERVER-3518)
  • 整数可以通过$gt/$lt查询,因此您可以高效地实现复杂的$or查询,尽管这是一个相当神秘的要求,$or查询没有任何问题...

Mongodb相关问答推荐

如何用Python和MongoDB找到单据字段的最大值?

在延迟函数中重用 context.WithTimeout

MongoDb $filter,然后获取非重复计数

可变用户 Select

Mongoose 返回包含属性内任何位置的值的所有文档

为什么使用整数作为 pymongo 的键不起作用?

哪种 NoSQL DB 最适合 OLTP 金融系统?

如何在 mongodb 中设置整数的默认值?

GeoJSON 和 MongoDB:将点存储为 GeoJSON.Point 是否值得?

MongoDB 2.1 聚合框架总和匹配名称的数组元素

Mongo查找对象内最长数组的查询

mongodump 是否锁定数据库?

如何在 MongoDB 集合中查找与给定条件匹配的文档和单个子文档

NoSql 参考数据

NoSQL:MongoDB 或 BigTable 并不总是 Available意味着什么

Mongoose / MongoDB 用户通知方案建议

MongoDB 在 mongoengine 中使用 OR 子句

在 MongoDB 上使用 $push 更新数组时避免重复值

mongoose字符串到 ObjectID

无法连接到远程服务器上的 mongo