Как 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