Is there a convention to name collection in MongoDB?

The general conventions are:

  • Lowercase names: this avoids case sensitivity issues, as MongoDB collection names are case sensitive.
  • Plural: more obvious to label a collection of something as the plural, e.g. "files" rather than "file"
  • No word separators: Avoids issues where different people (incorrectly) separate words (username <-> user_name, first_name <-> firstname). This one is up for debate according to a few people around here, but provided the argument is isolated to collection names I don't think it should be ;) If you find yourself improving the readability of your collection name by adding underscores or camelCasing your collection name is probably too long or should use periods as appropriate which is the standard for collection categorization.
  • Dot notation for higher detail collections: Gives some indication to how collections are related. For example, you can be reasonably sure you could delete "users.pagevisits" if you deleted "users", provided the people that designed the schema did a good job ;)

Examples:

users
pagevisits
users.pagevisits

Field name conventions (should) follow some of the same logic although camel casing those is fairly common.


Just avoid using hyphens in your collection names.

And that's only because, if you use the cli of the two below calls, the first is invalid JavaScript:

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

They are both functionally identical, but the second is slightly more annoying to type and doesn't tab-complete.

Apart from that, advantages/disadvantages depend on your use of the collections. Being consistent is more important than which convention you choose.


In http://docs.mongodb.org/manual/reference/limits/, the manual states that the collection names should begin with an underscore ('_') or a letter character, and cannot:

  • contain the $.
  • be an empty string (e.g. "").
  • contain the null character.
  • begin with the system. prefix. (Reserved for internal use.)

However, if you follow the rule and create a collection with '_' as the beginning letter, such as "_TWII", you will encounter trouble when you want to drop the collection. See the test below and the way to fix it. Collection '_TWII' was created under '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
> 

A short-cut to delete _TWII collection while under 'people' db:

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