mongodb安装及常用命令


Mongodb MongoDB 是一个基于分布式文件存储的数据库。由是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 NoSQL NoSQL(NoSQL = Not Only SQL ),意即,意即"不仅仅是不仅仅是SQL"。。 在现代的计算系统上每天网络上都会产生庞大的数据量。在现代的计算系统上每天网络上都会产生庞大的数据量。 这些数据有很大一部分是由关系数据库管理系统(这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。)来处理。 1970年年 E.F.Codd's提出的关系模型的论文提出的关系模型的论文 "A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。,这使得数据建模和应用程序编程更加简单。 通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用 的主导技术。的主导技术。 NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的的拥护者们提倡运用非关系型的 数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。 这一类数据库主要会使用到一个这一类数据库主要会使用到一个哈希表哈希表,这个表中有一个特定的键和一个指针指向特定的数据。,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于模型对于IT系统来说的系统来说的 优势在于简单、易部署。但是如果优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,只对部分值进行查询或更新的时候,Key/value就显得效率低下了。就显得效率低下了。 对于对于NoSQL并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征: 不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数 据时,并不需要预先定义它们的模式。据时,并不需要预先定义它们的模式。 无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器往往将数据划分后存储在各个本地服务器 上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。 弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。 分区:相对于将数据存放于同一个节点,分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区 的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。 异步复制:和异步复制:和RAID存储系统不同的是,存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个 节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数 据。据。 BASE:相对于事务严格的:相对于事务严格的ACID特性,特性,NoSQL数据库保证的是数据库保证的是BASE特性。特性。BASE是最终一致性和软事务。是最终一致性和软事务。 NoSQL的优点的优点/缺点缺点 优点优点: - 高可扩展性高可扩展性 - 分布式计算分布式计算 - 低成本低成本 - 架构的灵活性,半结构化数据架构的灵活性,半结构化数据 - 没有复杂的关系没有复杂的关系 缺点缺点: - 没有标准化没有标准化 - 有限的查询功能(到目前为止)有限的查询功能(到目前为止) - 最终一致是不直观的程序最终一致是不直观的程序 一、一、Mongodb的安装:的安装: 1.下载地址:下载地址:http://www.mongodb.org/downloads 2.解压缩到自己想要安装的目录,比如解压缩到自己想要安装的目录,比如d:\mongodb 3.创建文件夹创建文件夹d:\mongodb\data\db、、d:\mongodb\data\log,分别用来安装,分别用来安装db和日志文件,在和日志文件,在log文件夹下创建一个日志文文件夹下创建一个日志文 件件MongoDB.log,即,即d:\mongodb\data\log\MongoDB.log 4.进入进入dos命令界面,执行下列命令命令界面,执行下列命令 > cd d:\mongodb\bin     > d:\mongodb\bin>mongod -dbpath "d:\mongodb\data\db" 看到类似的信息,则说明启动成功,默认看到类似的信息,则说明启动成功,默认MongoDB监听的端口是监听的端口是27017,,mysql的是的是3306,打开浏览器输入,打开浏览器输入http://localhost:27017出出 现下图所示说明配置成功现下图所示说明配置成功 5.测试连接测试连接  新开一个 新开一个cmd窗口,窗口,进入进入mongodb的的bin目录目录,输入,输入mongo或者或者mongo.exe,出现如下信息说明测试通过,此时我们已经进入了,出现如下信息说明测试通过,此时我们已经进入了test 这个数据库,如何进入其他数据库下面会说。这个数据库,如何进入其他数据库下面会说。 输入输入exit或者或者ctrl+C可退出。可退出。 6.当当mongod.exe被关闭时,被关闭时,mongo.exe 就无法连接到数据库了,因此每次想使用就无法连接到数据库了,因此每次想使用mongodb数据库都要开启数据库都要开启mongod.exe程序,所以比程序,所以比 较麻烦,此时我们可以将较麻烦,此时我们可以将MongoDB安装为安装为windows服务服务  还是运行 还是运行cmd,进入,进入bin文件夹,执行下列命令文件夹,执行下列命令 > d:\mongodb\bin>mongod --dbpath "d:\mongodb\data\db" --logpath "d:\mongodb\data\log\MongoDB.log" --install --serviceName "MongoDB"  这里 这里MongoDB.log就是开始建立的日志文件,就是开始建立的日志文件,--serviceName "MongoDB" 服务名为服务名为MongoDB  接着 接着启动启动mongodb服务服务 > d:\mongodb\bin>NET START MongoDB 打开任务管理器,可以看到进程已经启动,也可以看到服务里面已经有一个名为打开任务管理器,可以看到进程已经启动,也可以看到服务里面已经有一个名为MongoDB的服务项了的服务项了 二、使用二、使用mongodb 基本操作命令:基本操作命令: (首先在(首先在cmd窗口跳转到窗口跳转到mongodb安装目录下的安装目录下的bin文件夹,然后运行文件夹,然后运行mongo.exe,然后就可以使用如下命令操作数据库),然后就可以使用如下命令操作数据库) show dbs:显示数据库列表显示数据库列表 show collections:显示当前数据库中的集合(类似关系数据库中的表):显示当前数据库中的集合(类似关系数据库中的表) show users:显示用户:显示用户 use :切换当前数据库,这和:切换当前数据库,这和MS-SQL里面的意思一样里面的意思一样 db.help():显示数据库操作命令,里面有很多的命令:显示数据库操作命令,里面有很多的命令 db.foo.help():显示集合操作命令,同样有很多的命令,:显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令的集合,并非真正意义上的命令 db.foo.find():对于当前数据库中的:对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)集合进行数据查找(由于没有条件,会列出所有数据) db.foo.find( { a : 1 } ):对于当前数据库中的:对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫集合进行查找,条件是数据中有一个属性叫a,且,且a的值为的值为1 在在mongodb中创建数据库中创建数据库 如果你想创建一个如果你想创建一个“myTest”的数据库,先运行的数据库,先运行use myTest命令,之后就做一些操作(如:命令,之后就做一些操作(如:db.createCollection('user'))),这样就这样就 可以创建一个名叫可以创建一个名叫“myTest”的数据库。的数据库。 Collection聚集集合聚集集合 1、创建一个聚集集合(、创建一个聚集集合(table)) db.createCollection(“collName”, {size: 20, capped: 5, max: 100}); 2、得到指定名称的聚集集合(、得到指定名称的聚集集合(table)) db.getCollection("account"); 3、得到当前、得到当前db的所有聚集集合的所有聚集集合 db.getCollectionNames(); 4、显示当前、显示当前db所有聚集索引的状态所有聚集索引的状态 db.printCollectionStats(); 用户相关用户相关 1、添加一个用户、添加一个用户 db.addUser("name"); db.addUser("userName", "pwd123", true); 添加用户、设置密码、是否只读添加用户、设置密码、是否只读 2、数据库认证、安全模式、数据库认证、安全模式 db.auth("userName", "123123"); 3、、显示当前所有用户显示当前所有用户 show users; 4、删除用户、删除用户 db.removeUser("userName"); 其他其他 1、查询之前的错误信息、查询之前的错误信息 db.getPrevError(); 2、清除错误记录、清除错误记录 db.resetError(); 聚集集合查询聚集集合查询 1、查询所有记录、查询所有记录 db.userInfo.find(); 相当于:相当于:select* from userInfo; 默认每页显示默认每页显示20条记录,当显示不下的情况下,可以用条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入迭代命令查询下一页数据。注意:键入it命令不能带命令不能带“;;” 但是你可以设置每页显示数据的大小,用但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示这样每页就显示50条记录了。条记录了。 2、查询去掉后的当前聚集集合中的某列的重复数据、查询去掉后的当前聚集集合中的某列的重复数据 db.userInfo.distinct("name"); 会过滤掉会过滤掉name中的相同数据中的相同数据 相当于相当于::select distict name from userInfo; 3、查询、查询age = 22的记录的记录 db.userInfo.find({"age": 22}); 相当于:相当于: select * from userInfo where age = 22; 4、查询、查询age > 22的记录的记录 db.userInfo.find({age: {$gt: 22}}); 相当于:相当于:select * from userInfo where age >22; 5、查询、查询age < 22的记录的记录 db.userInfo.find({age: {$lt: 22}}); 相当于:相当于:select * from userInfo where age <22; 6、查询、查询age >= 25的记录的记录 db.userInfo.find({age: {$gte: 25}}); 相当于:相当于:select * from userInfo where age >= 25; 7、查询、查询age <= 25的记录的记录 db.userInfo.find({age: {$lte: 25}}); 8、查询、查询age >= 23 并且并且 age <= 26 db.userInfo.find({age: {$gte: 23, $lte: 26}}); 9、查询、查询name中包含中包含 mongo的数据的数据 db.userInfo.find({name: /mongo/}); //相当于相当于%% select * from userInfo where name like ‘%mongo%’; 10、查询、查询name中以中以mongo开头的开头的 db.userInfo.find({name: /^mongo/}); select * from userInfo where name like ‘mongo%’; 11、查询指定列、查询指定列name、、age数据数据 db.userInfo.find({}, {name: 1, age: 1}); 相当于相当于::select name, age from userInfo; 当然当然name也可以用也可以用true或或false,当用当用ture的情况下河的情况下河name:1效果一样,如果用效果一样,如果用false就是排除就是排除name,显示,显示name以外的列信息。以外的列信息。 12、查询指定列、查询指定列name、、age数据数据, age > 25 db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1}); 相当于:相当于:select name, age from userInfo where age >25; 13、按照年龄排序、按照年龄排序 升序:升序:db.userInfo.find().sort({age: 1}); 降序:降序:db.userInfo.find().sort({age: -1}); 14、查询、查询name = zhangsan, age = 22的数据的数据 db.userInfo.find({name: 'zhangsan', age: 22}); 相当于:相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’; 15、查询前、查询前5条数据条数据 db.userInfo.find().limit(5); 相当于:相当于:selecttop 5 * from userInfo; 16、查询、查询10条以后的数据条以后的数据 db.userInfo.find().skip(10); 相当于:相当于:select * from userInfo where id not in ( selecttop 10 * from userInfo ); 17、查询在、查询在5-10之间的数据之间的数据 db.userInfo.find().limit(10).skip(5); 可用于分页,可用于分页,limit是是pageSize,,skip是第几页是第几页*pageSize 18、、or与与 查询查询 db.userInfo.find({$or: [{age: 22}, {age: 25}]}); 相当于:相当于:select * from userInfo where age = 22 or age = 25; 19、查询第一条数据、查询第一条数据 db.userInfo.findOne(); 相当于:相当于:select top 1 * from userInfo; db.userInfo.find().limit(1); 20、查询某个结果集的记录条数、查询某个结果集的记录条数 db.userInfo.find({age: {$gte: 25}}).count(); 相当于:相当于:select count(*) from userInfo where age >= 20; 21、按照某列进行排序、按照某列进行排序 db.userInfo.find({sex: {$exists: true}}).count(); 相当于:相当于:select count(sex) from userInfo; 索引索引 1、创建索引、创建索引 db.userInfo.ensureIndex({name: 1}); db.userInfo.ensureIndex({name: 1, ts: -1}); 2、查询当前聚集集合所有索引、查询当前聚集集合所有索引 db.userInfo.getIndexes(); 3、查看总索引记录大小、查看总索引记录大小 db.userInfo.totalIndexSize(); 4、读取当前集合的所有、读取当前集合的所有index信息信息 db.users.reIndex(); 5、删除指定索引、删除指定索引 db.users.dropIndex("name_1"); 6、删除所有索引索引、删除所有索引索引 db.users.dropIndexes(); 修改、添加、删除集合数据修改、添加、删除集合数据 1、添加、添加 db.users.save({name: ‘zhangsan’, age: 25, sex: true}); 添加的数据的数据列,没有固定,根据添加的数据为准添加的数据的数据列,没有固定,根据添加的数据为准 2、修改、修改 db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true); 相当于:相当于:update users set name = ‘changeName’ where age = 25; db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true); 相当于:相当于:update users set age = age + 50 where name = ‘Lisi’; db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true); 相当于:相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’; 3、删除、删除 db.users.remove({age: 132}); 4、查询修改删除、查询修改删除 db.users.findAndModify({ query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}}, remove: true }); db.runCommand({ findandmodify : "users", query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}}, remove: true }); update 或或 remove 其中一个是必须的参数其中一个是必须的参数; 其他参数可选。其他参数可选。 参数参数 详解详解 默认值默认值 query 查询过滤条件查询过滤条件 {} sort 如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象, 该对象将被操作该对象将被操作 {} remo ve 若为若为true,被选中对象将在返回前被删除,被选中对象将在返回前被删除 N/A upda te 一个一个 修改器对象修改器对象 N/A new 若为若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。 false fields 参见参见Retrieving a Subset of Fields (1.5.0+) All fiel ds upser t 创建新对象若查询结果为空。创建新对象若查询结果为空。 示例示例 (1.5.4+) false 语句块操作语句块操作 1、简单、简单Hello World print("Hello World!"); 这种写法调用了这种写法调用了print函数,和直接写入函数,和直接写入"Hello World!"的效果是一样的;的效果是一样的; 2、将一个对象转换成、将一个对象转换成json tojson(new Object()); tojson(new Object('a')); 3、循环添加数据、循环添加数据 > for (vari= 0;i<30;i++) { ... db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); ... }; 这样就循环添加了这样就循环添加了30条数据,同样也可以省略括号的写法条数据,同样也可以省略括号的写法 > for (vari= 0;i<30;i++) db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); 也是可以的,当你用也是可以的,当你用db.users.find()查询的时候,显示多条数据而无法一页显示的情况下,可以用查询的时候,显示多条数据而无法一页显示的情况下,可以用it查看下一页的信息;查看下一页的信息; 4、、find 游标查询游标查询 >varcursor = db.users.find(); > while (cursor.hasNext()) { printjson(cursor.next()); } 这样就查询所有的这样就查询所有的users信息,同样可以这样写信息,同样可以这样写 varcursor = db.users.find(); while (cursor.hasNext()) { printjson(cursor.next); } 同样可以省略同样可以省略{}号号 5、、forEach迭代循环迭代循环 db.users.find().forEach(printjson); forEach中必须传递一个函数来处理每条迭代的数据信息中必须传递一个函数来处理每条迭代的数据信息 6、将、将find游标当数组处理游标当数组处理 varcursor = db.users.find(); cursor[4]; 取得下标索引为取得下标索引为4的那条数据的那条数据 既然可以当做数组处理,那么就可以获得它的长度:既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者或者cursor.count(); 那样我们也可以用循环显示数据那样我们也可以用循环显示数据 for (vari = 0, len = c.length(); ivar arr = db.users.find().toArray(); > printjson(arr[2]); 用用toArray方法将其转换为数组方法将其转换为数组 8、定制我们自己的查询结果、定制我们自己的查询结果 只显示只显示age <= 28的并且只显示的并且只显示age这列数据这列数据 db.users.find({age: {$lte: 28}}, {age: 1}).forEach(printjson); db.users.find({age: {$lte: 28}}, {age: true}).forEach(printjson); 排除排除age的列的列 db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson); 9、、forEach传递函数显示信息传递函数显示信息 db.things.find({x:4}).forEach(function(x) {print(tojson(x));});
还剩8页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

843111384

贡献于2016-11-19

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf