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

Margaret ·
更新时间:2024-11-13
· 671 次阅读

  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.9data此文件夹是用来存放数据文档的   创建完成之后,将此文件夹配置到mongoDB,让mongoDB将数据存放到此文件夹。   配置并启动数据库:   运行命令行:E:mongodb-win32-i386-2.0.9inmongod.exe --dbpath E:mongodb-win32-i386-2.0.9data   (如果没有指定,mongoDB启动时默认在路径C:data下存放数据文档)   第三步:   数据库启动之后,我们可以连接数据库进行访问并存储数据了   另起一个命令窗口并运行:E:mongodb-win32-i386-2.0.9inmongo.exe --dbpath E:mongodb-win32-i386-2.0.9data   后面的参数是要连接到的数据目录   默认情况下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中   1   2   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 }



nosql MongoDB

需要 登录 后方可回复, 如果你还没有账号请 注册新账号