在MongoDB中有名称集合的约定吗?

dan*_*car 70 naming-conventions mongodb

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

PageVisitpage_visit.

这些符号有任何优点/缺点吗?

Rem*_*iet 74

一般惯例是:

  • 小写名称:这可以避免区分大小写问题,因为MongoDB集合名称区分大小写.
  • 复数:更明显地将一些东西标记为复数,例如"文件"而不是"文件"
  • 没有单词分隔符:避免不同的人(错误地)单独的单词(用户名< - > user_name,first_name < - > firstname)的问题.根据这里的一些人的说法,这个问题可以讨论,但是如果参数与系列名称是隔离的,我认为它不应该是;)如果你发现自己通过添加下划线或camelCasing来提高你的收藏品名称的可读性集合名称可能太长,或者应该使用适当的句点,这是集合分类的标准.
  • 更高细节集合的点表示法:为集合的相关性提供一些指示.例如,如果您删除了"users",您可以合理地确定可以删除"users.pagevisits",前提是设计架构的人员做得很好;)

例子:

users
pagevisits
users.pagevisits
Run Code Online (Sandbox Code Playgroud)

字段名称约定(应该)遵循一些相同的逻辑,尽管骆驼套管是相当常见的.

  • 对于整个"无字分隔符"的事情,我将不得不与你意见不一致,特别是如果你在Python中使用MongoDB.下划线而不是空格是高度可读的,这是代码,模式等最期望的品质之一. (29认同)
  • 单数而不是复数,否则它映射到像Pluj中的Pojos这样的对象,你最终会得到一个Users类!而不是用户类 (6认同)
  • @Ricky我想是的.你所指的答案是混合了这里混合的相同概念.命名实体与命名集合.没有人会使用"Customers"作为实体名称,因为该答案的作者建议尽管他们可能使用CUSTOMERS作为SQL表名.正如你所说,这是一个非常主观的讨论.只要它在整个代码库中保持一致,就不应该有太多问题. (4认同)
  • 我认为单数更有意义,因为复数是隐含的.正如@Ricky所说,这个标准很久以前就已经在sql中建立了.[stackoverflow.com/questions/338156](http://stackoverflow.com/questions/338156/table-naming-dilemma-singular-vs-plural-names) (3认同)
  • 主观性是一件美好的事情;)如果你发现你自己的字段或集合名称中包含如此多的单词,强调提高代码可读性,你应该重新考虑整个名称.当然,每个人都有.我发现可能出现的不一致的问题是什么词被分开了一个更大的问题.不使用单词分隔符是相对语言无关的.如果您更喜欢下划线,那么Java开发人员可能更喜欢使用camelcasing,这会让人感到慌乱. (2认同)
  • @Ricky 恰恰相反。“users”包含零个或多个单独的用户。POJO 映射到其中一个用户。换句话说,您需要 2 个 POJO 实例来代表“users”集合中的两个用户。集合字面意思就是集合。您不会编写像“List&lt;User&gt; user;”这样的 Java 代码 (2认同)
  • 使用“点表示法表示更详细的集合”似乎与 MongoDB 本身命名集合的方式不同。这可能是一种特殊情况,但 GridFS 使用点表示法来指示相关集合,而不是更详细的集合。例如,在 GridFS 中,您将拥有集合“myfiles.files”和“myfiles.chunks”,而不是“myfiles”和“myfiles.chunks”。 (2认同)

AD7*_*six 29

只是避免在集合名称中使用连字符.

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

db.foo-bar.find();
db['foo-bar'].find();
Run Code Online (Sandbox Code Playgroud)

它们在功能上都是相同的,但第二种类似于输入更麻烦,并且没有标签完成.

除此之外,优点/缺点取决于您对集合的使用.保持一致比您选择的惯例更重要.

  • @toong,这是_database_名称,而不是集合. (5认同)

Dan*_*eng 16

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

  • 包含$.
  • 是一个空字符串(例如"").
  • 包含空字符.
  • 从系统开始.字首.(保留供内部使用.)

但是,如果您遵循规则并创建一个以"_"作为开头字母的集合,例如"_TWII",则在删除集合时会遇到问题.请参阅下面的测试以及解决方法.集合'_TWII'是在'people'db下创建的.

> 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
> 
Run Code Online (Sandbox Code Playgroud)

在'people'db下删除_TWII集合的捷径:

> db.createCollection('^TWII')
{ "ok" : 1 }
> db.getCollection('^TWII').drop()
true
Run Code Online (Sandbox Code Playgroud)


Dom*_*355 5

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

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

因此,请尝试以小写形式命名您的所有收藏,并且不使用特殊字符。您将避免很多错误 - 特别是如果您使用 Mongoose。Mongoose 有一些奇怪的查询特性。

例如,如果您有一个名为“courses”的集合,则需要按以下方式构建模型:

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

  }),
Run Code Online (Sandbox Code Playgroud)

请注意“course”是单数吗?Mongoose 会将其复数,因此您可能会看到一个空数组“[]”。--> 您正在查询一个不存在的集合。

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

  • 多元化确实让我着迷。他们对此非常煞费苦心。我很好奇我的收藏名称从何而来,因为我不记得指定过它。我有一个名为“glossary”的文档,Mongo 足够清楚,将 y 更改为 i 并添加 es,而不是仅仅添加 s! (2认同)