Как mongodb создает базу данных/коллекцию на лету

Mongodb достаточно крут, чтобы создавать базу данных/коллекцию "на лету", если мы запускаем код, похожий на

db.store.save({a: 789});

Он автоматически создает коллекцию store и добавляет к ней документ.

В моем понимании javascript говорится, что метод undefined объекта db нельзя вызвать метод. Это должно было привести к некоторой ошибке/исключению.

Мне любопытно разобраться в событиях за сценой, и если есть какая-то полезная ссылка, пожалуйста, укажите мне. Гуглинг не очень помог мне.

Ответ 1

Как я помню, в среде NodeJS вы должны сделать что-то вроде этого, чтобы создать запись: db.get('collectionName').insert({..something...}); или db.get('collectionName').save({...something...});, но вы не можете использовать имя коллекции как свойство db.

Линия, о которой вы упоминаете, используется только в оболочке MongoDB, которая не является Javascript. Я думаю, вы не понимаете, что такое оболочка MongoDB и какой драйвер MongoDB.

Короче говоря, MongoDB (драйвер) не может получить доступ к свойству undefined.

ИЗМЕНИТЬ

В ответ на ваш комментарий..

MongoDB JS-драйвер GitHub-страница довольно подробно указывает, как вставить поле и всегда использует синтаксис, который я упомянул: https://github.com/mongodb/node-mongodb-native

Что касается того, что вы используете в оболочке, довольно ясно, что вы не можете просто использовать Javascript в командной оболочке. Поэтому, я думаю, я укажу вам на то место, где вы можете увидеть, на каком языке был разработан MongoDB: http://www.mongodb.org/ почти в первой строке говорит, что он написан на С++.

Надеюсь, это поможет прояснить ваш вопрос.

Ответ 2

В JavaScript есть способ определить функцию, которая будет выполняться при вызове метода undefined.

Пример:

var o = {
  __noSuchMethod__: function(id, args) { console.log(id, '(' + args.join(', ') + ')'); }
};

o.foo(1, 2, 3);
o.bar(4, 5);
o.baz();

// Output
// foo (1, 2, 3)
// bar (4, 5)
// baz ()

Обратите внимание, что это нестандартная функция и сегодня работает только в Firefox.

Я не знаю, как MongoDB реализовал эту функцию, но я просто отвечаю, чтобы сообщить, что это можно сделать таким образом.

Подробнее см. ниже: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/noSuchMethod