mongoDB基本操作

/*
            @author:luowen
            @time:2013-08-01
        [mongoDB]    

            1.mongoDB安装
                下载mongodb-linux-i686-2.2.5.tgz
                tar -zxvf mongodb-linux-i686-2.2.5.tgz
                将其拷贝到/usr/local/mongodb
                在mongodb目录下创建data log 目录
                进入 bin ./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --fork 启动服务
                //可以将这个语句添加到/etc/init/local文件中每次自动启动
                ./mongo 进入数据库使用

            2.一些基本的操作    
                db.c1.find().sort({age:1}).skip(2).limit(3).count(1);

                $all :查询包含的
                    {name:'luowen',post:[1,23,4,5]}
                db.c1.find({post:{$all:[1,2]}}) --> true;
                db.c1.find({post:{$all:[1,2,4]}}) --> false;

                $exists 测试一个字段是否存在 xx.xx.find({$exists:[post]})

                $mod 取余 xx.xx.find({id:{$mod:[1,2,]}})

                $ne 不等于 xx.xx.find({id:{$ne:[1,2,3,2]}})

                $in xx.xx.find({id:{$in:[12,12,2,2]}});

                $nin xx.xx.find({id:{$nin:[1,2,3,4,5,5]}})

                $or 名字是user1或者age是1的记过 xx.xx.find({$or:[{name:'user1',age:1}]})

                $nor 名字不是user1 age不是1的 xx.xx.find({$nor:[{name:'user1',age:1}])

                $size 去除post的值是3的数据 xx.xx.insert({post:[1,2,3]}) xx.xx.find({post:{$size:3}})

                $skip $limit 实现分页

                $elemMatch 元素匹配 匹配数组arr中id为3的值
                    xx.xx.find({arr:{$elemMathc:{id:3}}}) 
                游标 x = xx.xx.find() x.hasNext() 判断 x.next() 取出内容

                $slice xx.xx.find({name:'user'},{post:{$slice:3}}) 去出前三篇帖子

                [update]
                
                $set 保存原有的格式,然后在修改 xx.xx.update({name:'user1'},{$set:{age:30}}) 给user1的用户添加了一个字段age

                $inc 自增     
                $unset删除不需要的字段xx.xx.update({},{$unset:{score:1}},0,1);删除score字段
                $push 压入数据到collections中 xx.xx.update({name:'user1'},{$push:{arr:8}},0,1);
                $pushAll 同事压入多个数据 xx.xx.update({name:'user1'},{$pushAll:{arr:[2,32,12,21,1212]}});同时压入多个数据

                $addToSet 当表中存在时,就压入,如有重复就不压入 xx.xx.update({name:'user1'},{$addToSet:{arr:12}}) 如果arr中存在12,则不压入,不存在则压入

                $pop 删除数组中最后一个元素 xx.xx.update({name:'user1'},{$pop:{$arr:1}});

                $pull 只能操作数组 xx.xx.update({name:'user1'},{$pull:{arr:4}})删除数组arr中值为4的键
                $pullAll 删除多个xx.xx.update({name:'user1'},{$pullAll:{arr:[4,5]}})同事删除4和5值

                $rename更改字段名字xx.xx.update({name:'user1'},{$rename:{arr:'post'}})把arr字段更改为post

                $bit 位运算

                特殊操作符号 $
                    {'id':'213','arr':[{'title':'linux'},{'title':'java'},{'title':'php'}]}在arr数组中的title为linux的结果集中添加一个cont字段
                xx.xx.update({'arr.title':'linux'},{'arr.$.cnt':'linux is very good!'});

                res
                {'id':'213','arr':[{'title':'linux','cnt':'linux is very good'},{'title':'java'},{'title':'php'}]}

                db.dropDatabase() //删除数据库
                db.collections.drop //删除集合
                db.createCollection('c1') //穿件一个集合
                db.createCollection('c2',{capped:true,size:1000,max:5}) //创建一个固定结合只能放5个json多了就把前面的推出去
                db.runCommand({convertToCapped:'c1',size:1000,max:4}); //将c1转化成一个固定集合

                GridFS一个大文件系统

                ./mongofiles put 文件名
                ./mongofiles get 文件名
                ./mongofiles delete 文件名
                ./mongofiles list 列出上传文件
                db.fs.files.find(); //查找信息
                db.fs.files.remove(); //移除信息
                db.fs.chunks.find() //查看源文件
                db.fs.chunks.remove() //删除源文件

            [性能篇]
                查看一个语句的影响行数
                    db.c1.find({name:'user'}).explain();
                增加一个索引
                    db.c1.ensureIndex({name:true},{background:true}) //在后台建立name的索引
                查看索引
                    db.c1.getIndexes();
                查看索引键
                    db.c1.getIndexKeys();
                添加一个唯一索引
                    db.c1.ensureIndex({age:1},{unique:1}); //给age创建了一个唯一索引
                删除索引
                    db.c1.dropIndex({age:1}) //删除age的索引
                    db.c1.dropIndexes();//删除所有的索引,除id一歪
            [慢查询日志]

                启动的时候 添加 --profile=[0,1,2]
                    0:不记录
                    1:记录慢查询日志
                    2:记录所有的日志
                            添加 --slowms
                    ./mongod --dapath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/log/logs.log --profile=1 --slowms=300 --fork
                在启动后
                 > db.getProfilingLevel();
                 > db.setProfilingLevel(1) //设置开启慢查询
                 xx.xx.find({},{field1:1,field2:1,field3:1}).sort({field:-1}).limit(8);//查询出结果,返回字段,排序,限制条数

            [性能监控]
                ./mongosniff --source
                ./mongostat

            [管理篇]
                数据导入 mangoexport -d dabataseName -c collectionName -o /home/bakName.bak
                数据导出 mangoimport -d databasesName -c collections /home/bakName.bak

                备份 mongodump -d databaseName
                恢复 mongorestore -d databaseName /备份路径文件 

            [用户授权]
                mongod --auth 添加验证选项
                user admin //超级管理员
                db.addUser('root','luowen');//超级管理员密码
                每个数据库一个管理员,只能在这个数据库里面转

            [架构篇]
                主从复制
                    Master-Slave 复制(主从)
                    Replica Sets 复制(副本集)

                    1.简单的主从
                        ./mongod --master --dbpath=/data1 
                        ./mongod --slave --source 主服务器地址ip--dbpath=/data2
                    2.Replica Sets(副本集复制)
                         ./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/key1 --dbpath=path/data1
                         ./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/key2 --dbpath=path/data2 //两个主服务器启动了,在同一个组中rs1中
                         //配置会议室(随便登入一台服务器)
                         config_rs1={_id:'rs1',members:[{_id:0,host:"localhost:20001",priority:1},{_id:1,host:"localhost:20002",priority:2}]}
                         //初始化清单
                         rs.initiate(config_rs1);
                         rs.slaveOk();//设置从服务器有读的权限

 

posted @ 2013-08-03 17:46  arvim  阅读(439)  评论(0编辑  收藏  举报