【问题标题】:Is there a convention to name collection in MongoDB?在 MongoDB 中是否有命名集合的约定?
【发布时间】:2012-04-09 17:34:15
【问题描述】:

我想知道是否有数据库集合的约定,例如:

PageVisitpage_visit

这些符号有什么优点/缺点吗?

【问题讨论】:

标签: mongodb naming-conventions


【解决方案1】:

MongoDB 有一些命名约定。其中之一是数据库名称不区分大小写。此外,如果未指定,mongo 会将您的集合名称复数。 “课程”将变成“课程”。

由于数据库名称在 MongoDB 中不区分大小写,因此数据库名称 不能仅根据字符的大小写不同。

由于它们,请尽量以小写字母命名您的所有收藏,并且不要使用特殊字符。你会避免很多错误——尤其是如果你使用 Mongoose。 Mongoose 有一些奇怪的查询特性。

例如,如果您有一个名为“课程”的集合,那么您需要如何构建模型:

const LawModel = mongoose.model(
  "course",
  new mongoose.Schema({
    id: String,
    name: String,

  }),

注意“课程”是如何单数的? Mongoose 会将它复数,因此您可能会看到一个空数组“[]”。 --> 你正在查询一个不存在的集合。

尝试重命名和调整您的模型。

【讨论】:

  • 多元化的事情真的让我着迷。他们为此付出了很大的努力。我很好奇我的收藏名称来自哪里,因为我不记得指定它。我有一个名为词汇表的文档,Mongo 很清楚将 y 更改为 i 并添加 es,而不是仅仅扑通一声放在 s 上!
  • 我知道!不得不深入研究文档来解决同样的问题。这个问题的最佳答案提到 MongoDB 的约定是“区分大小写”的,而实际上它们是“不区分大小写的”。因此,为什么我从文档中复制了上述摘录。干杯!
【解决方案2】:

http://docs.mongodb.org/manual/reference/limits/ 中,手册规定集合名称应以下划线('_')或字母字符开头,并且不能:

  • 包含 $。
  • 为空字符串(例如“”)。
  • 包含空字符。
  • 从系统开始。字首。 (保留供内部使用。)

但是,如果你按照规则创建一个以'_'作为开头字母的集合,例如“_TWII”,你想删除集合时会遇到麻烦。请参阅下面的测试以及修复它的方法。集合“_TWII”是在“人”数据库​​下创建的。

> show collections
_TWII
employees
system.indexes
> db._TWII.drop()
2015-02-19T16:34:56.738-0800 TypeError: Cannot call method 'drop' of undefined

> use admin
switched to db admin

> db.runCommand({renameCollection:"people._TWII",to:"people.TWII"})
{ "ok" : 1 }
> use people
switched to db people
> show collections
TWII
employees
system.indexes
> db.TWII.drop()
true
> show collections
employees
system.indexes
> 

在“人”数据库​​下删除 _TWII 集合的快捷方式:

> db.createCollection('^TWII')
{ "ok" : 1 }
> db.getCollection('^TWII').drop()
true

【讨论】:

    【解决方案3】:

    一般约定是:

    • 小写名称:这可以避免区分大小写的问题,因为 MongoDB 集合名称​​区分大小写
    • 复数:更明显的是将某物的集合标记为复数,例如“文件”而不是“文件”
    • 无单词分隔符:避免不同人(错误地)分隔单词(用户名 用户名、名字 名字)的问题。根据这里的一些人的说法,这个是有争议的,但如果这个论点是孤立于集合名称的,我认为它不应该是;)如果你发现自己通过添加下划线或驼峰来提高你的集合名称的可读性你的馆藏名称可能太长或应酌情使用句号,这是馆藏分类的标准。
    • 更详细集合的点表示法:给出集合如何相关的一些指示。例如,如果您删除“users”,您可以合理地确定您可以删除“users.pagevisits”,前提是设计架构的人做得很好;)

    例子:

    users
    pagevisits
    users.pagevisits
    

    字段名称约定(应该)遵循一些相同的逻辑,尽管骆驼式外壳相当普遍。

    【讨论】:

    • 我将不得不在整个“无单词分隔符”的事情上不同意你的观点,尤其是当你将 MongoDB 与 Python 一起使用时。下划线而不是空格具有高度可读性,这是代码、模式等最理想的品质之一。
    • 主观性是一件美丽的事情;) 如果您发现自己的字段或集合名称中有很多单词,下划线会提高代码的可读性,那么您可能真的应该重新考虑整个名称。当然各有各的。我发现单词分隔可能不一致的问题是一个更大的问题。不使用单词分隔符与语言无关。如果您更喜欢下划线,Java 开发人员可能更喜欢驼峰式,这很快就会变得混乱。
    • 单数而不是复数,否则它会映射到复数中的 Pojos 等对象,您最终会得到一个用户类!而不是用户类
    • @Ricky 我想是的。您所指的答案是混淆了此处混合的相同概念。命名实体与命名集合。正如该答案的作者所建议的那样,即使他们可能使用 CUSTOMERS 作为 SQL 表名,也没有人会使用“客户”作为实体名称。正如你所说,这是一个非常主观的讨论。只要它在整个代码库中保持一致,就不应该有太大的问题。
    • 我认为单数更有意义,因为复数是隐含的。正如@Ricky 所说,这个标准是很久以前在sql 中建立的。 stackoverflow.com/questions/338156
    【解决方案4】:

    请避免在集合名称中使用连字符。

    那只是因为,如果你使用下面两个调用的cli,第一个是无效的JavaScript:

    db.foo-bar.find();
    db['foo-bar'].find();
    

    它们在功能上是相同的,但是第二个输入起来有点烦人,并且不能完成制表符。

    除此之外,优点/缺点取决于您对集合的使用。保持一致比您选择哪种约定更重要。

    【讨论】:

    • : 是否对命名空间集合名称有效,如foo:bar
    • 任何东西都对 mongo 有效。例如db["\n"].insert({}); - 没有错误。要考虑的主要是您使用的驱动程序的便利性。
    • 这在 Windows 上的 2.2 中发生了变化:/\。 "*:|? 不再有效 - 请参阅 docs.mongodb.org/manual/release-notes/2.2/…
    • @toong,这是 数据库 名称,而不是集合。
    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 2015-09-30
    • 2016-05-16
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多