【IT168 技术】访问MongoDB的重点是掌握对JavaScript的使用,更确切地说是对Mozilla SpiderMonkey JavaScript引擎的使用。JavaScript已经融入到MongoDB的各个方面,用户可以将MongoDB看做是为变量提供大量存储空间的JavaScript。MongoDB用JavaScript脚本来查询、插入、执行、编写脚本及“存储过程”。并且在MongoDB中,数据以JSON(JavaScript Object Notation)格式存储,当插入一个对象时,需要构建一个JSON对象;当查询时,返回的数据也为一个JSON对象,等等。在Mongo内部,JSON使用它的二进制形式表示,名为BSON。
可以看到,使用MongoDB的过程中需要使用大量JavaScript和JSON,因此如果开发者对JavaScript不感兴趣,那么MongoDB应该不适合你!在MongoDB中也有很多类似于表的collection,但与RDBMS类似,每一行都使用相同的列(属性),只是在collection中不是列(属性)而是对象,所有对象均使用相同的“primary key”(称为_id),并且对象本身为一个可以拥有任意属性的JSON对象。这也是为什么说MongoDB是“Schemaless”,因为除了_id之外并没有为对象设置schema(如“rows”)。
schemaless设计给出的表达式的值有时会超出唯一key,没有其他方式访问这些数据,并且此时也没有创建二级索引,当然用户是可以为其创建二级索引的!
这里简单介绍一下MongoDB。安装完MongoDB后,启动该数据库服务器,通过在命令行输入“mongo”从命令行进入程序。本示例的MongoDB使用sharded安装,因此提示符为“mongos”。大家在使用时提示符可能不同,该提示符主要取决于安装时的配置以及所使用的MongoDB版本。首先通过以下命令创建一个数据库:
大家也许会问,前文并没有创建数据库,就可以访问它吗?是的,MongoDB就是这样,只需要访问一个数据库或collection,如果不存在,MongoDB会替用户创建它们。这也是为什么在许多MongoDB数据库中,即便是正在使用的产品中,也会存储大量名称拼写错误的数据库和collection了。
此时查看刚刚访问的数据库,可以看到这里并没有mytest数据库:
admin (empty)
config 0.1875GB
test (empty)
因为数据库里面目前还没有collection,需要先创建一个:
再次通过访问不存在的对象来创建它,这里创建的collection命名为foo,该对象有一个值为1的属性attr1。现在mytest数据库已经存在,因为这个数据库里面已经包含数据了:
admin (empty)
config 0.1875GB
mytest 0.203125GB
可以看到,mytest数据库已经创建成功,collection foo也已经存在:
foo
system.indexes
现在已经创建了一个数据库和一个collection。接着再插入一些数据:
mongos> db.foo.insert({attr2: 3})
mongos> db.foo.insert({attr2: 4, attr3: 5})
所有这些数据均是有效数据,各个对象之间可以存在差异,以及包含不同的属性值。事实上,每个对象在创建时都可以根据用户意愿包含任意属性。
再插入一些数据:
mongos> db.foo.insert({attr2: 4, attr7: [10, 11, 12]})
这里先插入一个对象,该对象的属性也是一种对象,其中一个属性对象是一个数组。之后对数据进行查询。首先得到属性数据:
{ "_id" : ObjectId("4ea528fb35a81331e048baa9"), "attr1" : 1 }
{ "_id" : ObjectId("4ea52a4835a81331e048baaa"), "attr1" : 2 }
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }
{ "_id" : ObjectId("4ea52a5f35a81331e048baac"), "attr2" : 4, "attr3" : 5 }
{ "_id" : ObjectId("4ea52ae635a81331e048baad"), "attr2" : 4, "attr4" : { "attr5" : 6, "attr6" : 7 } }
{ "_id" : ObjectId("4ea52afc35a81331e048baae"), "attr2" : 4, "attr7" : [ 10, 11, 12 ] }