MongoDB的基本配置与操作

来源:互联网 发布:方志敏杀害传教士 知乎 编辑:程序博客网 时间:2024/05/29 11:09

  mongo是用c++编写的开源跨平台分布式非关系文档数据库,其可存储海量数据,主要用于查询操作。非关系nosql数据库主要有四大类,键值型数据库,如memcachedb、redis;列数据库,如hbase;文档型数据库,如mongo;图形数据库。通常在数据量很大,且需要不断扩容;要求读写速度非常快;需求会经常变更,导致数据模型无法确定;系统要求相当高的可用性的情况下会考虑使用mongo。
  
  mongod.conf文件用于设置mongo服务启动时的配置信息。
  port:指定服务端口,默认27017。
  dbpath:指定数据库文件存放目录,必须先创建目录,如/…/mongo/db。
  logpath:指定数据库日志文件存放目录与文件名,必须先创建目录和文件,如/…/mongo/mongod_27017.log。
  fork:指定服务是否为后台运行,默认非后台运行。
  bind_ip:绑定服务实例只接受来自指定ip的请求,默认可接收任意ip的请求。
  auth:指定服务是否以认证的方式启动,前提是必须在admin数据库中创建超级用户,默认不认证。
  journal:开启日志功能,默认开启。
  logappend:错误日志采用追加模式,默认为覆盖。

=======================================

// 解压安装包到当前目录tar xzf xxx.tgz// 在etc/rc.local文件内添加如下字符串,使mongo服务随着linux的启动而开机自启/安装目录/mongo-x.x.x/bin/mongod --config ../mongo_27017.conf// 在解压目录下执行,启动服务bin/mongod --config mongod_27017.conf// 启动客户端连接服务,为自带的javascript shell命令接口,可使用可视化的客户端工具,如sqlyogbin/mongo// 进入admin数据库use admin// 发送消息关闭与其连接的服务db.shutdownServer()

=======================================

  文档为核心,等同于关系数据库中的记录,数据结构类似json格式,由一对大括号以及之间的多个键值对构成。键不可重复,必须是字符串,在双引号之间,不能有空字符\0,不能用.或$,不能以_开头。值可以是任意类型,严格区分类型与大小写,且键值有序。
  集合由多个文档构成,等同于关系数据库的表,无固定模式,可存放任意格式文档。业务上使用集合来管理文档,结构更加清晰,且实际中通常同一个集合中存放相同模式的文档。集合的命名使用字符串,不能有空串,不能有\0空字符,不能以system开头,不能有$字符,可以使用类似java的包名,用点间隔。
  数据库由多个集合构成,一个服务实例可有多个相互完全独立的数据库,每个数据库都对应硬盘上一个不同的文件。数据库的命名使用字符串,要求同上,全部用小写。数据库对应硬盘的文件,其名字也最终会转为硬盘上的文件名,由此命名时应该注意兼容系统。

=======================================

  操作mongo前必须先进入某个数据库,然后在该库下执行命令,默认在test库下,初始所有数据库为空。若要以认证auth=true的方式启动服务,必须要在数据库中创建用户,才能使认证功能生效。

// 创建超级用户// 先将mongod.conf中auth=true注释掉,以非认证的方式启动服务// 切换到admin数据库use admin// 用户的信息位于其被指定的数据库的system.users集合中,创建超级用户db.createUser (    {        // 用户名        user: "lt",         // 用户密码        pwd: "123",         // 用户描述信息,可有可无        customData: {any info}        // 为用户分配角色,值为数组[],数组中一对{}就是一个角色,一个用户可分配多个角色        // 角色有内置的,也有自定义的,db指定该用户的该角色对哪个数据库起效        roles: [{role: "root", db: "admin"}, {....}, ....]    })// 内置角色  // 数据库操作角色// 允许用户读取指定的数据库read// 允许用户读写指定的数据库readWrite// 数据库管理角色// 允许用户对指定的数据库进行管理操作doAdmin// 允许用户对指定数据库的system.users集合进行操作userAdmin// 仅适用于admin数据库的角色// 允许用户对服务中的所有数据库进行读操作readAnyDatabase// 允许用户对服务中的所有数据库进行读写操作readWriteAnyDatabase// 赋予用户对服务中所有数据库的userAdmin权限userAdminAnyDatabase// 赋予用户对服务中所有数据库的dbAdmin权限dbAdminAnyDatabase// 超级用户root
// 创建其它用户// 输出当前的所有进程,并查找mongod关键字ps -ef | grep mongod// 查找出服务进程id后,杀死进程kill -2 pid// 将mongod.conf中对auth=true的注释取消,以认证的方式启动服务// 切换到admin数据库use admin// 使用超级用户认证登录db.auth("lt", "123")// 切换到test数据库use test// 为test数据库创建一个读写用户db.createUser (    {        user: "test-lt",         pwd: "123",         roles: [{role: "readWrite", db: "test"}]    })// 使用刚创建的账号认证登录db.auth("test-lt", "123")

=======================================

  mongo自带客户端访问其服务,该工具内置javascript解释器,可解释运行脚本语句和函数,其提供的全局变量db对象封装了对数据库操作的各种函数。

// 查看当前服务中的所有数据库show dbs// 切换到指定数据库,默认连接到test数据库// 若数据库不存在,则创建数据库,并切换到该数据库// 连接到数据库后,连接对象会被赋值给db,之后通过db的函数来操作数据库use dbname// 查看服务实例所在服务器的ip地址db.getMongo()// 查看当前数据库,直接db也可以db.getName()// 查看当前数据库状态db.stats()//查 看当前mongo服务的版本db.version()// 查看当前数据库中的所有集合show collections// 删除当前数据库中的xx集合,将当前数据库中的全部集合删除就等同于删除数据库db.xx.drop()// 插入// 创建文档doc,并初始化,key会自动加双引号,文档创建后必须插入集合才会生效doc={name: "lt", pwd: "123", sex: "man", age: 29}// 将文档doc插入集合user,若集合user不存在,自动创建// 系统自动为新插入集合的文档添加key为_id的键值对,用于唯一标识该文档db.user.insert(doc)// 先遍历集合,查看文档doc是否存在,若存在执行更新,不存在执行插入db.user.save(doc)// 用js脚本一次插入多个文档for(var i = 0; i < 10; i++) {    var doc = {name: "lt" + i, pwd: i, sex: "man", age: 29 + i};    db.user.insert(doc);}// 修改// 将user集合内name为lt的文档的对应键值改为ltnewdb.user.update({name: "lt"}, {$set, {name: "ltnew"}});// 删除// 将user集合内name为ltnew的文档删除db.user.remove({name: "ltnew"});// 删除集合内所有文档db.user.remove({});// 查询// 查看集合内的所有文档,一次最多只显示20个,输入it,可显示下一页的数据db.user.find()// 直接遍历,一次性显示所有的文档db.user.find().forEach(printjson);// 按条件查询,返回name为xx的文档db.user.find({name: "xx"}).forEach(printjson);// 按条件查询,返回name为xx的文档,{name: 1}表示仅返回name字段,{name: 0}表示返回除name意外的全部字段db.user.find({name: "xx"}, {name: 1}).forEach(printjson);// 返回所有文档,但仅返回name字段db.user.find({}, {name: 1}).forEach(printjson);// 仅返回符合条件的第一条数据printjson(db.user.findOne({条件}));// 仅返回符合条件的前3条数据db.user.find({条件}).limit(3);// 用js脚本来查看数据,用游标操作var cursor = db.user.find();while(cursor.hasNext()) {    printjson(cursor.next());}// 用数组操作var cursor = db.user.find().toArray();for(var i = 0; i < cursor.length(); i++) {    printjson(cursor[i]);}
0 0
原创粉丝点击