在MongoDB中是否有命名集合的约定?


Answers:


85

一般约定为:

  • 小写名称:避免大小写敏感的问题,因为MongoDB集合名称区分大小写
  • 复数:将某物的集合标记为复数(例如,“文件”而不是“文件”)会更明显
  • 没有单词分隔符:避免出现由不同的人(不正确)分隔单词(用户名<->用户名,名字_ <<>名字)的问题。根据周围的一些人的说法,这是一个有待讨论的问题,但是只要该参数与馆藏名称无关,我认为不应该这样;)如果您发现自己通过添加下划线或驼色来提高馆藏名称的可读性集合名称可能太长,或应适当使用句点,这是集合分类的标准。
  • 详细信息集合的点符号:指示集合之间的关系。例如,您可以合理地确定,如果您删除了“用户”,则可以删除“ users.pagevisits”,只要设计架构的人员做得很好;)

例子:

users
pagevisits
users.pagevisits

字段名称约定(应该)遵循某些相同的逻辑,尽管骆驼套非常常见。


32
对于整个“无字分隔符”,我将不得不与您不同意,尤其是如果您将MongoDB与Python结合使用。下划线而不是空格是高度可读的,这是代码,架构等的最理想的质量之一。
Noah McIlraith 2012年

2
主观性是一件很漂亮的事情;)如果您发现自己的字段或集合名称包含很多单词,而下划线可以提高代码的可读性,那么您可能应该重新考虑整个名称。当然要每个人。我发现可能出现的不一致问题是一个更大的问题。不使用单词分隔符与语言无关。Java开发人员可能更喜欢驼峰,而匆忙时会变得凌乱。
Remon van Vliet 2013年

7
单数而不是复数,否则它映射到Plural中的Pojos之类的对象,最终得到一个Users类!而不是User类
ricardoespsanto 2014年

4
@Ricky我猜是。您所指的答案是将这里混在一起的相同概念混在一起。命名实体与命名集合。没有人会使用“客户”作为实体名称,就像答案的作者所建议的那样,即使他们可能使用CUSTOMERS作为SQL表名称。正如您所说,这是一个非常主观的讨论。只要在整个代码库中保持一致,就不会有太大的问题。
Remon van Vliet 2014年

3
我认为单数形式更有意义,因为暗含了复数形式。就像@Ricky所说的,这个标准是很久以前在sql中建立的。stackoverflow.com/questions/338156
蒸汽动力

32

只要避免在集合名称中使用连字符即可。

这仅仅是因为,如果您使用以下两个调用的cli,则第一个是无效的JavaScript:

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

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

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


:有效的命名空间集合名称,如foo:bar
拉菲安2012年

任何东西都对mongo有效。例如db["\n"].insert({});-没有错误。要考虑的事情大多是您使用的驱动程序带来的便利。
AD7six 2012年

1
这在Windows上的2.2中已更改:/ \。“* <>:|不再有效-看到了吗?docs.mongodb.org/manual/release-notes/2.2/...

5
@toong,是为了 数据库名称,而不是集合。
BorisOkunskiy 2013年

19

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

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

但是,如果遵循规则并创建以“ _”作为开头字母的集合(例如“ _TWII”),则在删除该集合时会遇到麻烦。请参阅下面的测试以及修复方法。集合“ _TWII”是在“ people”数据库下创建的。

> 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
> 

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

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

0

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

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

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

例如,如果您有一个名为“ courses”的集合,则下面是构造模型的方法:

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

  }),

请注意“课程”如何单数?猫鼬会将它复数,因此为什么您会看到一个空数组“ []”。->您正在查询不存在的集合。

尝试重命名和调整模型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.