mongodb入门.docx_第1页
mongodb入门.docx_第2页
mongodb入门.docx_第3页
mongodb入门.docx_第4页
mongodb入门.docx_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

mongodb入门概念一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以bson(binary json)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50gb以上数据时,mongo数据库访问速度是mysql10倍以上。bsonbson是binary json的简称,是一个json文档对象的二进制编码格式。bson同json一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了json的数据类型。如:bson有date类型和bindate类型。bson被比作二进制的交换格式,如同protocol buffers,但bson比它更“schema-less”,非常好的灵活性但空间占用稍微大一点。bson有以下三个特点:1轻量级2跨平台3效率高命名空间mongodb存储bson对象到collections,这一系列的数据库名和collection名被称为一个命名空间。如同:java.util.list;用来管理数据库中的数据。索引mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,建立索引就意味着增加空间开销。默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的id比较合适,比如商品的id。特点: 高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 模式自由。 支持动态查询。 支持完全索引,包含内部对象。 支持查询。 支持复制和故障恢复。 使用高效的二进制数据存储,包括大型对象(如视频等)。 自动处理碎片,以支持云计算层次的扩展性 支持python,php,ruby,java,c,c#,javascript,perl及c+语言的驱动程序,社区中也提供了对erlang及.net等平台的驱动程序。 文件存储格式为bson(一种json的扩展)。 可通过网络访问。功能: 面向集合的存储:适合存储对象及json形式的数据。 动态查询:mongo支持丰富的查询表达式。查询指令使用json形式的标记,可轻易查询文档中内嵌的对象及数组。 完整的索引支持:包括文档内嵌对象及数组。mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。 查询监视:mongo包含一个监视工具用于分析数据库操作的性能。 复制及自动故障转移:mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片) 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。适用场合: 网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。 缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存层可以避免下层的数据源 过载。 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。 高伸缩性的场景:mongo非常适合由数十或数百台服务器组成的数据库。mongo的路线图中已经包含对mapreduce引擎的内置支持。 用于对象及json数据的存储:mongo的bson数据格式非常适合文档化格式的存储及查询。mongodb安装与配置1、下载mongodb安装包/linux/mongodb-linux-x86_64-2.2.2.tgz mongo.tgzcurl /linux/mongodb-linux-i686-2.2.2.tgz mongo.tgz2、解压创建tar -zxvf mongo.tgz mkdir -p /data/dbchown mongo /data/db启动脚本mongo_start.sh#!/bin/bash#find mongodb client tools dirif -e /usr/bin/mongo ; then mongo_path=/usr/bin config_path=/u01/mongodb/felse exitfi echo bin: $mongo_path $config_path#sudo -u mongo numactl -interleave=all $mongo_path/mongod -config $config_path 配置参数fdbpath = /u01/mongodb/datalogpath = /u01/mongodb/log/mongodb.logrepairpath = /u01/mongodb/tmppidfilepath = /u01/mongodb/run/mongodb.piddirectoryperdb = true#sysinfo = true#verbose = truelogappend = true#cpu = true#network and security setnoauth = trueport = 27015maxconns = 1024fork = true#management#nohttpinterface = truerest = truequota = truequotafiles = 1024nssize = 16syncdelay = 5#replicationreplset = etaooplogsize = 10240具体请看/manual/tutorial/getting-started/设置仲裁(主从)db.runcommand(replsetinitiate:_id:etao,members:_id:1,host:5:27017, _id:2,host:5:27018,_id:3,host:2:27017,_id:4,host:2:27018,arbiteronly:true) mongodb命令及sql语法对比mysqlmongodb说明mysqldmongod服务器守护进程mysqlmongo客户端工具mysqldumpmongodump逻辑备份工具mysqlmongorestore逻辑恢复工具db.repairdatabase()修复数据库mysqldumpmongoexport数据导出工具sourcemongoimport数据导入工具grant * privileges on *.* to db.adduser()db.auth()新建用户并权限show databasesshow dbs显示库列表show tablesshow collections显示表列表show slave statusrs.status查询主从状态create table users(a int, b int)db.createcollection(mycoll, capped:true,size:100000) 另:可隐式创建表。创建表create index idxname on users(name)db.users.ensureindex(name:1)创建索引create index idxname on users(name,ts desc)db.users.ensureindex(name:1,ts:-1)创建索引insert into users values(1, 1)db.users.insert(a:1, b:1)插入记录select a, b from usersdb.users.find(,a:1, b:1)查询表select * from usersdb.users.find()查询表select * from users where age=33db.users.find(age:33)条件查询select a, b from users where age=33db.users.find(age:33,a:1, b:1)条件查询select * from users where age33 and age30db.users.find(age: $gt: 30).count()获取表记录数select distinct last_name from usersdb.users.distinct(last_name)去掉重复值select * from users order by namedb.users.find().sort(name:-1)排序select * from users order by name descdb.users.find().sort(name:-1)排序explain select * from users where z=3db.users.find(z:3).explain()获取存储路径update users set a=1 where b=qdb.users.update(b:q, $set:a:1, false, true)更新记录update users set a=a+2 where b=qdb.users.update(b:q, $inc:a:2, false, true)更新记录delete from users where z=abcdb.users.remove(z:abc)删除记录db. users.remove()删除所有的记录drop database if exists test;use testdb.dropdatabase()删除数据库drop table if exists test;db.mytable.drop()删除表/collectiondb.adduser(test, test)添加用户readonly-falsedb.adduser(test, test, true)添加用户readonly-truedb.adduser(test,test222)更改密码db.system.users.remove(user:test)或者db.removeuser(test)删除用户use admin超级用户db.auth(test, test)用户授权db.system.users.find()查看用户列表show users查看所有用户db.printcollectionstats()查看各collection的状态db.printreplicationinfo()查看主从复制状态show profile查看profilingdb.copydatabase(mail_addr,mail_addr_tmp)拷贝数据库db.users.datasize()查看collection数据的大小db. users.totalindexsize()查询索引的大小shell操作数据库1.超级用户相关:1. #进入数据库adminuse admin2. #增加或修改用户密码db.adduser(name,pwd)3. #查看用户列表db.system.users.find()4. #用户认证db.auth(name,pwd)5. #删除用户db.removeuser(name)6. #查看所有用户show users7. #查看所有数据库show dbs8. #查看所有的collectionshow collections9. #查看各collection的状态db.printcollectionstats()10. #查看主从复制状态db.printreplicationinfo()11. #修复数据库db.repairdatabase()12. #设置记录profiling,0=off 1=slow 2=alldb.setprofilinglevel(1)13. #查看profilingshow profile14. #拷贝数据库db.copydatabase(mail_addr,mail_addr_tmp)15. #删除collectiondb.mail_addr.drop()16. #删除当前的数据库db.dropdatabase()2.增删改1. #存储嵌套的对象db.foo.save(name:ysz,address:city:beijing,post:100096,phone:138,139)2. #存储数组对象db.user_addr.save(uid:,al:,)3. #根据query条件修改,如果不存在则插入,允许修改多条记录db.foo.update(yy:5,$set:xx:2,upsert=true,multi=true)4. #删除yy=5的记录db.foo.remove(yy:5)5. #删除所有的记录db.foo.remove()3.索引1. #增加索引:1(ascending),-1(descending)2. db.foo.ensureindex(firstname: 1, lastname: 1, unique: true);3. #索引子对象4. db.user_addr.ensureindex(al.em: 1)5. #查看索引信息6. db.foo.getindexes()7. db.foo.getindexkeys()8. #根据索引名删除索引9. db.user_addr.dropindex(al.em_1)4.查询1. #查找所有2. db.foo.find()3. #查找一条记录4. db.foo.findone()5. #根据条件检索10条记录6. db.foo.find(msg:hello 1).limit(10)7. #sort排序8. db.deliver_status.find(from:).sort(dt,-1)9. db.deliver_status.find().sort(ct:-1).limit(1)10. #count操作11. db.user_addr.count()12. #distinct操作,查询指定列,去重复13. db.foo.distinct(msg)14. #”=”操作15. db.foo.find(timestamp: $gte : 2)16. #子对象的查找17. db.foo.find(address.city:beijing)5.管理1. #查看collection数据的大小2. db.deliver_status.datasize()3. #查看colleciont状态4. db.deliver_status.stats()5. #查询所有索引的大小6. db.deliver_status.totalindexsize()5.advanced queries:高级查询条件操作符$gt : $lt : =$lte: =$ne : !=、$in : in$nin: not in$all: all$not:反匹配(1.3.3及以上版本)查询name bruce and age = 18的数据db.users.find(name: $ne: bruce, age: $gte: 18);查询creation_date 2010-01-01 and creation_date 18的记录,以下查询都一样db.users.find(age: $gt: 18);db.users.find($where: this.age 18);db.users.find(this.age 18);f = function() return this.age 18 db.users.find(f);排序sort()以年龄升序ascdb.users.find().sort(age: 1);以年龄降序descdb.users.find().sort(age: -1);限制返回记录数量limit()返回5条记录db.users.find().limit(5);返回3条记录并打印信息db.users.find().limit(3).foreach(function(user) print(my age is + user.age);结果my age is 18my age is 19my age is 20限制返回记录的开始点skip()从第3条记录开始,返回5条记录(limit 3, 5)db.users.find().skip(3).limit(5);查询记录条数count()db.users.find().count();db.users.find(age:18).count();以下返回的不是5,而是user表中所有的记录数量db.users.find().skip(10).limit(5).count();如果要返回限制之后的记录数量,要使用count(true)或者count(非0)db.users.find().skip(10).limit(5).count(true);分组group()假设test表只有以下一条数据 domain: , invoked_at: d:2009-11-03, t:17:14:05, response_time: 0.05, http_action: get /display/docs/aggregation使用group统计test表11月份的数据count:count(*)、total_time:sum(response_time)、avg_time:total_time/count;db.test.group( cond: invoked_at.d: $gt: 2009-11, $lt: 2009-12, key: http_action: true, initial: count: 0, total_time:0, reduce: function(doc, out) out.count+; out.total_time+=doc.response_time , finalize: function(out) out.avg_time = out.total_time / out.count );http_action : get /display/docs/aggregation,count : 1,total_time : 0.05,avg_time : 0.05mongodb for javamongodb java driver 简单操作一、java驱动一致性 mongodb的java驱动是线程安全的,对于一般的应用,只要一个mongo实例即可,mongo有个内置的连接池(池大小默认为10个)。 对于有大量写和读的环境中,为了确保在一个session中使用同一个db时,我们可以用以下方式保证一致性: db mdb = mongo.getdb(dbname); mdb.requeststart(); / / 业务代码 / mdb.requestdone(); db和dbcollection是绝对线程安全的,它们被缓存起来了,所以在应用中取到的可能是同一个对象。 二、保存/查找对象(dbobject) java驱动提供了dbobject接口,方便我们保存对象到数据库中。 定义需要保存的对象: public class tweet implements dbobject /* . */ 然后我们可以使用该对象: tweet tweet = new tweet(); tweet.put(user, userid); tweet.put(message, message); tweet.put(date, new date(); collection.insert(tweet); 当从数据库中查询时,结果会自动的转换成dbobject对象,我们可以转换成我们自己的类型: collection.setobjectclass(tweet); tweet mytweet = (tweet)collection.findone();三、创建连接 mongo m = new mongo(); mongo m = new mongo(localhost); mongo m = new mongo(localhost, 27017); db db = m.getdb(mydb); 注意:事实上,mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个mongo实例对我们来说已经足够了。 四、认证(可选的) boolean auth = db.authenticate(myusername, mypasswd); 五、取得collection列表 set colls = db.getcollectionnames(); for(string s : colls) system.out.prinln(s); 六、获取一个collection dbcollection coll = db.getcollection(testcollection); 使用dbcollection,我们可以进行插入、查询数据等数据操作。七、插入文档 假设有个json文档如下所示: name: mongodb, type: database, count: 1, info: x: 203, y: 102 注意:上面的json文档有个内嵌文档info。 我们完全可以利用basicdbobject来创建一个和上面的json一样的文档,并且把它保存在mongodb中。 dbobject doc = new basicdbobject(); doc.put(name, mongodb); doc.put(type, database); doc.put(count, 1); dbobject info = new basicdbobject(); info.put(x, 203); info.put(y, 102); doc.put(info, info); coll.insert(doc); 八、查询第一个文档(findone()) 为了验证在上面我们保存的类似json的数据,我们可以用findone()方法取得数据。 findone(): 返回一个文档; find(): 返回一个游标(dbcursor),其中包含一组对象dbobject; dbobject doc = coll.findone(); system.out.println(doc); 我们将会看到控制台输出: _id : 49902cde5162504500b45c2c , name : mongodb , type : database , count : 1 , info : x : 203 , y : 102 , _ns : testcollection 九、插入多个文档为了在后来展示更多的查询方法,我们先插入几个文档,它们的json像这样: i: value 使用一个循环插入数据: for(int i = 0; i 50的文档集合: query = new basicdbobject(); query.put(i, new basicdbobject($gt, 50); / i50 cursor = coll.find(query); while(cursor.hasnext() dbobject object = cursor.next(); system.out.println(object); 比如查询条件为 20i=30: query = new basicdbobject(); / 20i=30 query.put(i, new basicdbobject($gt, 20).append($lte, 30); cursor = coll.find(query); while(cursor.hasnext() dbobject object = cursor.next(); system.out.println(object); 十四、创建索引 mongodb支持索引,并且给一个dbcollection添加索引非常简单,你只要指明需要创建索引的字段,然后指明其是升序(1)还是降序(-1)即可,比如在i上创建升序索引。 coll.createindex(new basicdbobject(i, 1); / 1代表升序 十五、查询索引 我们可以查询到所有的索引: list list = coll.getindexinfo(); for(dbobject index : list) system.out.println(index); 控制台的输出类似如下所示: name : i_1 , ns : mydb.testcollection , key : i : 1 , _ns : system.indexesmongodb的管理功能一、获取所有的数据库mongo m = new mongo(); for(string s : m.getdatabasenames() system.out.println(s); 二、删除数据库m.dropdatabase(my_new_db); mongodb的java类型一、对象id objectid被用作自动生成的唯一id. objectid id = new objectid(); objectid copy = new objectid(id); 二、正则表达式 pattern john = ppile(joh?n, case_insensitive); dbobject query = new basicdbobject(name, john); / 查询所有 name 匹配 /joh?n/i 的文档 dbcursor cursor = collection.find(query); 三、日期和时间date now = new date(); dbobject time = new basicdbobject(ts, now); collection.save(time); 四、数据库引用dbref可以用来保存数据库引用。 dbref addressref = new dbref(db, foo.bar, address_id); dbobject address = addressref.fetch(); dbobject person = basicdbobjectbuilder.start() .add(name, fred) .add(address, addressref) .get(); collection.save(person); dbobject fred = collection.findone(); dbref addressobj = (dbref)fred.get(address); addressobj.fetch(); 五、二进制数据字节数组(byte)被当作二进制数据。 六、内嵌文档json样式的数据如下: x: y: 3 则在m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论