NoSql数据库初探-mongoDB环境搭建

  NoSQL数据库一改关系型数据库的缺点,更容易的集成、分布式、无模式、故障恢复等特色,正在一步步餐食关系型数据库的市场,做为一个与时俱进的码农了解一下新技术是必须的,尤为是在读了《NoSql精粹》以后,更是想体验一下NoSql数据库的威力。

  MongoDB是一种文档数据库,也就是说对于领域模型中的每个聚合来说,都会做为一个文档来存储。
   MongoDB有以下优势:
  面向文档存储、全索引支持、同步机制和高访问性、自动分片、查询、灵活的汇集和数据处理、映射化简、文件存储。
 
第一步:安装
  从版本2.2开始,mongoDB就不支持XP操做系统了,蛋疼,如今我就在用XP,看来只能用2.2以前的版本了,
可用的版本只有一个2.0.9,我已经共享到百度网盘了,下载地址:http://pan.baidu.com/s/1i3GEs1v,若是下载地址失效了,请去官网下载。
 
第二步:设置数据库环境并启动数据库
  将压缩版解压以后放到任意一个硬盘上,好比我就放到了E:\mongodb-win32-i386-2.0.9
先建立一个存放文档文件的文件夹,E:\mongodb-win32-i386-2.0.9\data此文件夹是用来存放数据文档的 
建立完成以后,将此文件夹配置到mongoDB,让mongoDB将数据存放到此文件夹。
  配置并启动数据库:
  运行命令行:E:\mongodb-win32-i386-2.0.9\bin\mongod.exe --dbpath E:\mongodb-win32-i386-2.0.9\data
  (若是没有指定,mongoDB启动时默认在路径C:\data下存放数据文档)
 
第三步:
  数据库启动以后,咱们就能够链接数据库进行访问并存储数据了
  另起一个命令窗口并运行:E:\mongodb-win32-i386-2.0.9\bin\mongo.exe --dbpath E:\mongodb-win32-i386-2.0.9\data
  后面的参数是要链接到的数据目录
  默认状况下mongoDB会选中一个名叫test的数据库,若是不知道当前所处的数据库,能够运行db命令来查看
  查看全部的数据库:
show dbs

 

  切换数据库:
use mydb

 

  若是此时切换的数据库不存在,不要紧,只要不向该数据库存放数据,mongoDB是不会在硬盘上建立该数据库的。
 
  是该存放数据的时候了,先说一下mongoDB中的一些概念。
  mongoDB中有db、collection、document,db就对应关系数据库中的数据库,而collection则对应了关系型数据库中的表,而document就对应了关系型数据库表中的一行数据。mongoDB中的文档就像一个json文件同样,咱们能够将一个javascript中的对象字面量建立为一个document,如经过以下方式定义了两个对象变量:
j = { name : "mongo" }
k = { x : 3 }
 
  将j和k这两个文档存入名为“testData”的collection中
db.testData.insert( j )
db.testData.insert( k )
  前面已经说过了,db为当前所处的数据库对象,而testData是一个collection,此时尚未对应的collection,当insert执行完毕以后,就建立了collection对象
咱们能够经过
show collections
 
命令来查看当前数据库中全部的collection
此时会返回testData和 system.indexes, system.indexes是mongoDB本身提供的collection,不用管它
咱们能够经过以下语句查询testData中的全部的数据
db.testData.find()

 

此时的find方法会返回一个游标对象
由于此时并无一个变量接收该游标对象,因此会默认至多打印出20条数据(固然只会打印刚刚的那两条数据,由于咱们的testData中只有这两条)
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }

 

_id属性是mongoDB自动生成的,由于每一个文档都要有一个“主键”(跟关系型数据库中主键很像),而此时咱们并无提供_id。
咱们来试着添加更多的数据:
在命令行中输入:
for (var i = 1; i <= 25; i++) db.testData.insert( { x : i } )

 

一个for循环,循环插入了25条数据
咱们再执行一下
db.testData.find()

 

结果输出
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be9"), "x" : 4 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bea"), "x" : 5 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990beb"), "x" : 6 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bec"), "x" : 7 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bed"), "x" : 8 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bee"), "x" : 9 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bef"), "x" : 10 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf0"), "x" : 11 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf1"), "x" : 12 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf2"), "x" : 13 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf3"), "x" : 14 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf4"), "x" : 15 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf5"), "x" : 16 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf6"), "x" : 17 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf7"), "x" : 18 }
has more

 

只输出了20条数据
后面还有has more提示后面还有数据
再在命令行中输入it会输出下一批20条数据
 
如何才能将数据所有输出呢?
此时咱们用一个变量来接收游标:
var c = db.testData.find()

 

c就是游标对象
此时咱们经过for循环将所有数据输出:
while ( c.hasNext() ) printjson( c.next() )

 

printjson方法将文档以json的格式输出
 
游标对象的hasNext方法用来判断是否还有下一个文档,而next方法用来获取下一个文档。
 
若是咱们只想获取第5个文档,该怎么办呢?
固然能够在遍历游标的时候对遍历过的文档计数,并将第5个文档输出便可,可是这种方式确实是有点啰嗦了。
咱们此时能够在游标对象上直接添加一个下标便可,如:
printjson( c [ 4 ] )

 

此时输出了第5个文档
 { "_id" : ObjectId("51a7dc7b2cacf40b79990bea"), "x" : 5 }

 

可是此时请注意:
c [ 4 ]方法会将全部该collection下的文档读取进内存,这至关于在游标上执行了cursor.toArray() 方法,
此方法将全部的文档加载到了内存中,而后再在返回的数组中查找索引值是4的文档,因此游标下标方法应慎用啊
 
若是咱们想查询a是18的那个document该怎么办呢?
此时咱们还能够借助find方法,可是此时要给find方法提供一个模板文档
一个模板文档详细描述了查询策略,如:db.testData.find( { x : 18 } )
此时的{x:18}就是一个模板文档,是指查询文档时只保留x为18的文档。
查询结果以下:
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf7"), "x" : 18 }
 
不要忘了,find方法返回一个游标对象,只不过此时的查询只有一个文档符合条件。
 
若是只想返回一个文档,而不是游标对象,可使用findOne方法,findOne方法返回一个文档对象,无论符合条件的文档有多少个,它只返回第一个。
 
若是想对返回的文档数目进行限制,能够在游标上调用limit方法,以下:
db.testData.find().limit(3)

 

只会返回前3个文档
结果以下:
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }
 

 

参考连接:http://docs.mongodb.org/manual/
相关文章
相关标签/搜索