MongoDB如何动态创建数据库/集合

11

Mongodb很酷,能够在运行类似于以下代码时动态创建数据库/集合:

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

它会自动创建一个store集合并向其中添加一个文档。

我的javascript理解认为,在db对象的未定义属性上调用方法是不可能的。它应该导致某种错误/异常。

我很想了解幕后发生的事情,如果有任何有帮助的链接,请指引我。谷歌搜索并没有对我有太大帮助。


1
虽然我不知道这个问题的答案,但我相信MongoDB是用C++开发的。你在Javascript中使用的是驱动程序,这些驱动程序是用它们应该使用的语言开发的(如果我错了,请纠正我)。然而问题仍然存在,我只是觉得记录这一点会很有用。 - martskins
Mongo是开源的,所以如果你有时间,你可以挖掘一下前面提到的JS驱动程序来看看是否能够弄清楚它的工作方式 =) - Josh Darnell
2个回答

4
在JavaScript中,有一种定义函数的方式,在调用未定义的方法时将执行该函数。
例如:
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

2
MongoDB 2.4+ 使用 V8 JavaScript 引擎 - Stennie

2
据我回忆,在NodeJS环境中,你必须像这样做才能创建记录:db.get('collectionName').insert({..something...});或者db.get('collectionName').save({...something...});,但你不能使用集合名称作为db的属性。
你提到的这行代码仅在MongoDB shell中使用,它不是Javascript。我猜你误解了什么是MongoDB shell和什么是MongoDB驱动程序。
简而言之,MongoDB(驱动程序)无法访问未定义的属性。
编辑:
针对你的评论...
MongoDB JS驱动程序的GitHub页面非常清晰地指出了如何插入字段,并始终使用我提到的语法:https://github.com/mongodb/node-mongodb-native 至于你在shell中使用的内容,很明显你不能在命令shell中只使用Javascript。所以我想我会把你指向一个可以看到MongoDB开发语言的地方:http://www.mongodb.org/,几乎第一行就说它是用C++编写的。
希望这有助于澄清你的问题。

是的,答案似乎是对我问题的评论的延伸。非常感谢。如果可能的话,您能否请引用任何引用相同内容的链接。 - dopeddude
是的,那很有帮助。谢谢。 - dopeddude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接