Чи існує конвенція щодо іменування колекції в MongoDB?


Відповіді:


90

Загальними умовами є:

  • Малі імена : це дозволяє уникнути проблем з чутливістю до регістру, оскільки імена колекцій MongoDB чутливі до регістру .
  • Множина : більш очевидне позначення колекції чогось як множини, наприклад "файли", а не "файл"
  • Без розділювачів слів : Уникає проблем, коли різні люди (неправильно) розділяють слова (ім’я користувача <-> ім'я користувача, ім'я <-> ім'я). Цей виставляється на дебати за відгуками кількох людей, які перебувають тут, але за умови, що аргумент ізольований від назв колекцій, я не думаю, що це повинно бути;) Якщо ви виявите, що покращуєте читабельність назви вашої колекції, додаючи підкреслення або верблюд назва колекції, ймовірно, занадто довга або повинна використовувати періоди, як це підходить, що є стандартом для категоризації колекції.
  • Точкові позначення для більш детальних колекцій : Дає певні вказівки на те, як колекції пов’язані. Наприклад, ви можете бути впевнені, що можете видалити "users.pagevisits", якщо ви видалили "користувачів", за умови, що люди, які розробляли схему, добре виконали свою роботу;)

Приклади:

users
pagevisits
users.pagevisits

Конвенції про назви полів (повинні) слідувати одній і тій же логіці, хоча оболонка верблюда є досить поширеною.


33
Мені доведеться не погодитись з вами щодо цілої справи "без роздільників слів", особливо якщо ви використовуєте MongoDB з Python. Підкреслення замість пробілів добре читаються, що є однією з найбільш бажаних якостей коду, схеми тощо.
Ноа МакІлрейт

2
Суб’єктивність - це прекрасна річ;) Якщо ви опинитеся з іменами полів чи колекцій, у яких так багато слів, що підкреслення покращують читабельність коду, вам, мабуть, слід переглянути цю назву в цілому. Для кожного своє звичайно. Я вважаю проблему можливих невідповідностей, які слова відокремлюються, набагато більшою. Невикористання сепараторів слів є відносно мовно агностичним. Там, де ви віддаєте перевагу підкресленням, розробник Java, ймовірно, віддасть перевагу камелінгу, і це стає брудно поспіхом.
Remon van Vliet

7
Інакше, а не множина, інакше він відображається на такі об’єкти, як Pojos у множині, і ви отримуєте клас Users! а не клас користувача
ricardoespsanto

4
@Ricky Це, я гадаю. Відповідь, на яку ви посилаєтесь, полягає у змішуванні тих самих понять, які змішані тут. Присвоєння імені сутності проти іменування колекції. Ніхто не буде використовувати "Клієнти" як ім'я сутності, як пропонує автор цієї відповіді, хоча вони можуть використовувати КЛІЄНТИ як ім'я таблиці SQL. Як ви кажете, це надзвичайно суб'єктивна дискусія. Поки це послідовно у всій кодовій базі, проблем не повинно бути занадто багато.
Remon van Vliet

3
Я думаю, що однина має більше сенсу, оскільки мається на увазі множина. І як каже @Ricky, цей стандарт був створений в sql давно. stackoverflow.com/questions/338156
SteamPowered

32

Просто уникайте використання дефісів у назвах колекцій.

І це лише тому, що, якщо ви використовуєте cli двох викликів нижче, перший недійсний JavaScript:

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

Вони обидва функціонально однакові, але другий трохи дратує друк і не заповнює вкладку.

Крім того, переваги / недоліки залежать від використання вами колекцій. Бути послідовним важливіше того, яку конвенцію ви вибрали.


Чи :дійсні для назв колекцій простору імен, як у foo:bar?
рафіян

що-небудь діє для mongo. напр. db["\n"].insert({});- помилки немає. Слід врахувати переважно зручність драйвера, яким ви користуєтесь.
AD7six

1
Це змінилось у 2.2 у вікнах: / \. «* <>: | Більше не дійсна - см? Docs.mongodb.org/manual/release-notes/2.2 / ...
Toong

5
@toong, це стосується імен баз даних , а не колекцій.
Борис Окунський

19

У http://docs.mongodb.org/manual/reference/limits/ в посібнику зазначено, що імена колекцій повинні починатися з підкреслення ('_') або символу літери, і не може:

  • містять $.
  • бути порожнім рядком (наприклад, "").
  • містять нульовий символ.
  • Почніть із системи. префікс. (Зарезервовано для внутрішнього використання.)

Однак, якщо ви дотримуєтесь правила і створюєте колекцію з початковою літерою "_", наприклад "_TWII", у вас виникне проблема, коли ви захочете скинути колекцію. Дивіться тест нижче та спосіб його виправлення. Колекція "_TWII" була створена в розділі "люди" 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
> 

Швидкий шлях до видалення колекції _TWII, перебуваючи в розділі "people" db:

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

0

MongoDB має деякі правила іменування. Один з них полягає в тому, що ім’я бази даних не враховує регістр. Крім того, mongo буде множиною назви вашої колекції, якщо не вказано. "курс" стане "курсом".

Оскільки в MongoDB імена баз даних не чутливі до регістру, імена баз даних не можуть відрізнятися лише за регістром символів.

Через них намагайтеся називати всю свою колекцію малими літерами та без спеціальних символів. Ви уникнете великої кількості помилок, особливо якщо ви використовуєте Mongoose. Mongoose має деякі дивні особливості запитів.

Наприклад, якщо у вас є колекція з назвою "курси", ось як вам потрібно структурувати свою модель:

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

  }),

Зверніть увагу, як "курс" є єдиним числом? Mongoose буде множиною, тому ви можете побачити порожній масив "[]". -> ви запитуєте неіснуючу колекцію.

Спробуйте перейменувати та відкоригувати свою модель.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.