MongoDb
介绍MongoDB 是一个面向集合的,模式自由的文档型数据库.1 面向集合, 意思是数据被分组到若干集合,这些集合称作聚集(collections). 在数据库里每个聚集有一个唯一的名字,可以包含无限个文档. 聚集是RDBMS(关系型数据库管理系统)中表的同义词,区别是聚集不需要进行模式定义.2模式自由, 意思是数据库并不需要知道你将存入到聚集中的文档的任何结构信息.实际上,你可以在同一个聚集中存储不同结构的文档.3.文档型, 意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 "" 即 "Binary Serialized dOcument Notation."4.存贮:MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。Mongodb结构图http://dl.iteye.com/upload/picture/pic/70632/8224c15f-ea03-3f76-a51c-4d714ea3efcf.pngMongoDB 运行概述MongoDB 是一个服务器进程可以运行在 Linux, Windows 和OS X等操作系统. 支持 32 和 64位模式,我们推荐使用64位模式,因为在32位模式下Mongo的数据库大小有2GB的限制.MongoDB 进程默认情况下使用监听端口为 27017(可以在启动时用命令行参数修改,详细信息参考 ). Clients 连接 MongoDB 进程(如果安全认证系统激活的话需要进行用户认证),执行一系列的操作,比如插入,查询,更新等. MongoDB 使用文件存储数据. (默认位置 /data/db/), 使用内存映射文件进行高效的数据管理. MongoDB 还能配置成 [自动数据复制], 即 [自动故障切换]. 有关 MongoDB 的更多管理信息,参见 .MongoDB 功能对于开发人员, MongoDB 驱动提供了丰富的操作:•查询:基于查询对象或者类SQL语句搜索文档. 查询结果可以排序,进行返回大小限制,可以跳过部分结果集,也可以返回文档的一部分.•插入和更新 : 插入新文档,更新已有文档.•索引管理 : 对文档的一个或者多个键(包括子结构)创建索引,删除索引等等•常用命令: 所有MongoDB 操作都可以通过socket传输的DB命令来执行. 下载、安装和启动Linux 32-bit创建数据库默认存储目录$ mkdir -p /data/db下载使用curl, 获取预编译的版本$ curl -O http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz解压$ tar xzf mongodb-linux-i686-latest.tgzLinux下的启动启动数据库服务器:./mongodb-xxxxxxx/bin/mongodmongod命令等价于mongod --dbpath=/data/db以认证的方式启动 mongod –auth启动mongo数据库客户端./mongodb-xxxxxxx/bin/mongoWindows 32-bit创建数据库默认存储目录创建data和db目录,比如 C:\data\db . 这是数据库文件的默认存放位置.下载http://downloads.mongodb.org/win32/mongodb-win32-i386-v1.6-latest.zip 并解压32位版本的.zip文件.Windows下的启动启动mongo数据库服务器启动命令行并运新,mongodb-xxxxxxx\bin\mongod.exe启动mongo数据库客户端:启动 bin\mongon.exe Mongo客户端常用命令数据库相关命令show dbs // 列出所有数据库use memo // 使用数据库memo。即使这个数据库不存在也可以执行,但该数据库不会立刻被新建,要等到执行了insert之类的操作时,才会建立这个数据库show collections // 列出当前数据库的collections 查看各collection的状态db.printCollectionStats() db // 显示当前数据库show users // 列出用户 db.system.users.find()// 列出用户 db.removeUser('user1') //删除用户collection db.c1.drop()//删除集合c1db.dropDatabase()//删除当前的数据库安全与认证use shine // 如果要root权限,就用admin库db.addUser("username", "password") // 普通权限,可读写db.addUser("username", "password", true)// 只可读,不可写db.system.users.remove({user: username}) // 删除用户保存数据db.c1.save({name:"zhangsan",age:18}) //没有写主键,系统会自动生成一个主键,主键名为_id,对象id(文档对象id)每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常是一个BSON对象id,因此,这个id对于集合中的每个成员都是唯一的,如果用户插入一个document没有提供一个id,数据库将自动生成一个id,并存储在_id字段。The BSON ObjectId Datatype一个BSON ObjectID是由12个字节组成:4字节时间+3字节机器id+2字节进程id+3字节的数字01234567891011timemachinepidinc注:我们没有创建集合,数据库在第一次插入的时候自动创建2. db.c1.save({_id:1,name:"lisi",age:22})//自己填写id主键值,id主键值可以是字符串类型,也可以是数字类型3. db.c1.save({"name" : "MongoDB","type" : "database","count" : 1,"info" : {x : 203,y : 102}})保存更加复杂的数据创建索引:coll.ensureIndex({productid:1}) // 在productid上建立普通索引coll.ensureIndex({district:1, plate:1}) // 多字段索引coll.ensureIndex({productid:1}, {unique:true}) // 唯一索引coll.ensureIndex({productid:1}, {unique:true, dropDups:true|) // 建索引时,如果遇到索引字段值已经出现过的情况,则删除重复记录coll.getIndexes() // 查看索引coll.dropIndex({productid:1}) // 删除单个索引查询1.coll.find() // select * from coll2.coll.find().limit(10) // select * from coll limit 103.coll.find().sort({x:1}) // select * from coll order by x asc4.coll.find().sort({x:-1}) // select * from coll order by x desc5.coll.find().sort({x:1}).skip(5).limit(10) // select * from coll order by x asc limit 5, 106.coll.find({x:10}) // select * from coll where x = 107.coll.find({x: {$lt:10}}) // select * from coll where x <= 108.coll.find({}, {y:true}) // select y from coll9.通过游标访问数据> var cursor = db.collect1.find();> while(cursor.hasNext()) printjson(cursor.next())//当数据超过20行时候,使用it命令查看更多数据10.通过forEach> db.collect1.find().forEach(printjson)11.在mongo shell中,你可以将游标认为是数组> var cursor =db.collect1.find();> printjson(cursor){ "_id" : ObjectId("4c691e72ed2a47b462dfa806"), "x" : 4, "y" : 3 }使用这种方式存取需要注意的是,在cursor之前的所有数据都会同时被加载到内存,对于很大的结果集,这样操作是不恰当的,会导致内存溢出,当查询巨大数据量大时候,游标应当作为迭代器使用。SQL语句不能做到的,mongo也可以做到1.coll.find({"address.city":"gz"}) // 搜索嵌套文档address中city值为gz的记录2.coll.find({likes:"math"}) // 搜索数组3.coll.ensureIndex({"address.city":1}) // 在嵌套文档的字段上建更新1.db.user.update({uid:1},{$set:{age:26}}) //update user set age=26 where uid=12.db.user.update({uid:1},{$inc:{age:1}}) //update user set age=age+1 where uid=1删除db.user.delete({uid:1})//delete user where uid=1 数据导出、导入:1.// json或csv格式,每次一个collection2.mongoexport -d producttrade -c basic -o /home/data/mongo_backup/producttrade_100504.json3.mongoimport -d producttrade -c basic --drop /home/data/mongo_backup/producttrade_100504.json4.5.// 二进制数据格式,常用于备份、还原6.mongodump -d shine -o /home/data/mongo_backup7.mongorestore -d shine --drop /home/data/mongo_backup/shine 开发指南:1.数据库连接:标准的连接格式:mongodb://host1[:port1][,host2[:port2],...[,hostN[:portN]]]mongodb://是一个必须的前缀标识,表明是一个标准的连接格式username:password@可选,如果给定,驱动连接数据库后,将使用该用户名和密码登录数据库host1这是uri部分必须要的,它标明需要连接到那个服务器地址:portX是一个可选项,不提供,缺省使用27017端口/database需要登录的数据库名,如果使用了username:password@符号,不提供,默认使用admin数据库连接池:服务器为每一个tcp连接使用一个线程,因此,建议你的应用使用数据库连接池2.数据库每个mongoDb服务可以支持多个数据库,每个数据库都是独立的,每个数据库中的数据都是分开存储的,既安全,又易于管理。一个数据库是由多个集合组成,每个集合又是文档(document)对象组成相关命令:3.集合集合的名字必须开始与字母或者下划线,$是保留字,集合能够组织在一个命名空间中,通过.符号命名集合组,例如:你可以定义集合blog.posts和blog.authors,这两个集合都属于bolg下的;集合名字最大长度是128个字符(包括数据库的名字和索引),通常最好保持在80/90字符一下。mongo经常会用到哪里mongo相比较关系数据库,在于查询速度快,对并发支持的比较好,数据量很大,也不怎么影响速度,但mongo的相对查询比较简单,所以适合将一些数据查询比较简单但频繁,更新操作比较频繁,数据量比较大的信息放入到mongo库中
页:
[1]