mongo常用操作

来源:互联网 发布:java过滤器工作原理 编辑:程序博客网 时间:2024/06/10 05:51
mogodb1、brew install mongodb2、启动mongo服务  mongod -config /usr/local/etc/mongod.conf3、/usr/local/etc/mongod.conf :所有数据保存的位置、日志信息都在此文件中、端开口号配置等都在这里记录    systemLog:      destination: file        path: /usr/local/var/log/mongodb/mongo.log  #保存日志位置      logAppend: true #打开日志输出操作    storage:      dbPath: /usr/local/var/mongodb  #数据库保存数据的位置    net:      bindIp: 127.0.0.1  #绑定的ip4、切换到admin数据库:use admin   关闭当前终端:db.shutdownServer()5、基础操作  5.1 创建数据库 :use mldn  #不会创建数据库,当添加数据时候回自动创建数据库      显示数据库:show databases #mldn不存在此时  5.2 创建集合:db.createCollection('emp') #这个时候添加集合的同时,创建了数据库mldn ,集合就是传统sql的表      显示数据库:show databases #发现存在mldn  5.3 向一个不存在的集合中插入数据:db.dept.insert({"deptno":10,"dename":"财务部","loc":"北京"})#这时候集合不存在,插入数据时候会自动创建集合      查看所有集合:show collections       插入不规则数据      var deptData = {        "deptno":20,        "dename":"研发部",        "loc":"上海",        "count":20,        "avg":8000.0      };      db.dept.insert(deptData) ;      db.dept.insert({"deptno":30,"dename":"市场部"})      【注意】:此时数据可以由用户随意指定,不用考虑同一个集合中其他数据的结构,所以在mongo中没有查看集合结构的命令,因为每一条数据可能结构都不同  5.4 查询集合数据:        db.dept.find() #查看集合中所有信息        db.dept.findOne()#查看集合中一条信息  5.5 关于ID:"_id" : ObjectId("59ad52c3c53ac106b3c4b1cb")   #时间戳+机器码+PID+计数器,绝对唯一  5.6 删除数据    db.dept.remove({"_id" : ObjectId("59ad52c3c53ac106b3c4b1cb")}) #删除一条数据  5.7 更新数据    var deptData = {      "deptno":20,      "dename":"乞讨部",      "loc":"家里蹲",      "count":20,      "avg":8000.0    };    db.dept.update({"_id" : ObjectId("59ad5469c53ac106b3c4b1cc")},deptData); #前面的是条件,后面的是更新的数据  5.8 删除集合:    db.dept.drop()  5.9 删除数据库:    db.dropDatabase() #在哪个数据库下就删除哪个数据库6、数据增加:db.集合.insert()    6.1 db.infos.insert({"url":"www.baidu.com"})  #插入一条数据    6.2 db.infos.insert([{"url":"www.qq.com"},{"url":"www.taobao.com"}]) #插入多条数据    6.3 保存10000条数据,与javascript语法差不多        for(var i = 0 ; i< 10000;i++){            db.infos.insert({"url":"mldn-"+i})        }        在此查询会显示20条默认,然后下方显示“Type "it" for more”,意思是输入it就显示下一页,it回车7、数据查询:db.集合.find({查询条件},[,{设置显示的字段}])    7.1 :db.infos.find()    7.2 :db.infos.find({"url":"www.baidu.com"}) #查询url为www.baidu.com    7.3 :db.infos.find({"url":"www.baidu.com"},{"_id":0}) #设置为0 的不显示在查询结果集中,设置为1显示,不设置默认为1    7.4 :db.infos.find({"url":"www.baidu.com"},{"_id":0}).pretty() #漂亮显示,格式化,列多的时候比较好看8、关系运算(大于($gt)、小于($lt)、大于等于($gte)、小于等于($lte)、等于(key:val、$eq)、不等于($ne))      准备测试数据:      db.students.insert({"name":"张三","sex":"男","age":19,"score":89,"address":"海淀区"})      db.students.insert({"name":"李四","sex":"女","age":20,"score":59,"address":"朝阳区"})      db.students.insert({"name":"王五","sex":"女","age":19,"score":99,"address":"西城区"})      db.students.insert({"name":"赵六","sex":"男","age":20,"score":100,"address":"东城区"})      db.students.insert({"name":"小七","sex":"男","age":19,"score":20,"address":"海淀区"})      db.students.insert({"name":"王八","sex":"女","age":21,"score":0,"address":"海淀区"})      db.students.insert({"name":"刘九","sex":"男","age":19,"score":70,"address":"朝阳区"})      db.students.insert({"name":"钱十","sex":"女","age":21,"score":56,"address":"西城区"})      8.1 (等于)查询姓名 “张三”        db.students.find({"name":"张三"})      8.2 (大于)查询年龄大于19岁的        db.students.find({"age":{"$gt":19}})      8.3 (大于等于) 查询成绩大于等于60分的        db.students.find({"score":{"$gte":60}})      8.4 (不等于) 查询姓名不是“王五”        db.students.find({"name":{"$ne":"王五"}})9、逻辑运算(与("$and")、或("$or")、非("$not""$nor"))    9.1 (与) 查询大于等于19并且小于等于20的人      db.students.find({"age":{"$gte":19,"$lte":20}})    9.2 (非) 查询年龄不是19岁的人      db.students.find({"age":{"$ne":19}})    9.3 (或)年龄大于19岁,或者成绩大于90分的学生      db.students.find({          "$or":[            {"age":{"$gte":19}},            {"score":{"$gte":90}}          ]      })    9.3($nor)年龄不大于19或者成绩不大于90      db.students.find({          "$or":[            {"age":{"$gte":19}},            {"score":{"$gte":90}}          ]      })10、求模($mod):{"$mod":[数字,余数]}    db.students.find({"age":{"$mod":[20,0]}})  #结果是20,余数是0    db.students.find({"age":{"$mod":[20,1]}})  #结果是20,余数是111 、范围查询($in:在范围之中,$nin:不在范围之中)    db.students.find({"name":{"$in":['张三','李四','王五']}})    db.students.find({"name":{"$nin":['张三','李四','王五']}})12、数组查询(mongo支持数组保存)    先保存一部分数组数据:          db.students.insert({"name":"谷大神 - A","sex":"女","age":19,"score":80,"address":"西城区","course":['语文','数学','英语']})        db.students.insert({"name":"谷大神 - B","sex":"女","age":28,"score":56,"address":"东城区","course":['体育','数学','英语']})        db.students.insert({"name":"谷大神 - C","sex":"男","age":21,"score":71,"address":"朝阳区","course":['语文','美术','英语']})        db.students.insert({"name":"谷大神 - D","sex":"女","age":24,"score":62,"address":"西城区","course":['计算机','数学','英语']})    12.1 针对数组判断运算符($all,$size,$slice,$elemMatch)        $all:查询同时参加”语文“和”数学“的学生    #{"$all":["内容1","内容2",..]}          db.students.find({"course":{"$all":["语文","数学"]}})        数组索引:查询课程(下标从0开始)第二个内容为数学的信息          db.students.find({"course.1":"数学"})        $size :查询3报了三个课程的学生          db.students.find({"course":{"$size":2}})        $slice:返回年龄是19岁信息,但是要求只显示参加的前2门课程          db.students.find({"age":19},{"course":{"$slice":2}}) #取出course前2门信息          db.students.find({"age":19},{"course":{"$slice":2}}) #取出course后2门信息          db.students.find({"age":19},{"course":{"$slice":[1,2]}}) #跳过1个返回2个13、嵌套集合运算:$elemMatch     先保存一部分数组数据:          db.students.insert({"name":"吕大神 - A","parents":[{"name":"A父亲","job":"工人"},{"name":"A母亲","job":"职员"}]})        db.students.insert({"name":"吕大神 - B","parents":[{"name":"B父亲","job":"医生"},{"name":"B母亲","job":"教师"}]})        db.students.insert({"name":"吕大神 - C","parents":[{"name":"C父亲","job":"局长"},{"name":"C母亲","job":"医生"}]})        db.students.insert({"name":"吕大神 - D","parents":[{"name":"D父亲","job":"工人"},{"name":"D母亲","job":"局长"}]})     13.1 查询 ”吕大神 - A","吕大神 - B","吕大神 - C“ 三个同学的父母是医生的      db.students.find({"$and":[          {"name":{"$in":["吕大神 - A","吕大神 - B","吕大神 - C"]}},          {"parents":{"$elemMatch":{"job":"医生"}}}        ]})     【注】:尽量不要讲数据构造成这样,太麻烦14、判断字段是否存在 :$exists    14.1 查询带有parents成员的数据      db.students.find({"parents":{"$exists":true}})    14.2 查询不具有course成员的数据      db.students.find({"course":{"$exists":false}})    【注】:尽量保存时间结构一致15、条件过滤:$where    15.1 单个条件      db.students.find({"$where":"this.age > 20"})  #加了this会一条条去查询过滤      db.students.find("this.age > 20")  #加了this会一条条去查询过滤      db.students.find(function(){        return this.age > 20        })      db.students.find({"$where":function(){        return this.age > 20        }}) #这里要注意,加上$where,外面要多些一个{}      【注】:以上三个结果是一致的,所以对于$where是可以简化的,但是对于数据量比较大的不推荐使用,严格来讲是编写一个操作的函数一个一个去过滤    15.2 多个条件:      查询大于19小于21的人      db.students.find({"$and":[          {"$where":"this.age > 19"},          {"$where":"this.age < 21"},        ]})         【注】$where能利用javascript进行查询,但是把bson重新变成javascript循环验证,无法再利用到索引,效率低,再整个mongo中索引提升非常明显16、正则运算、模糊查询:如果想实现模糊查询,必须使用正则表达式,使用的是Perl兼容的正则表达形式    16.1 语法        基础语法:{key : 正则标记}        完整语法:{key:{"$regex":正则标记,"$options":选项}}        options:              i:忽略大小写 (最常用)              m:多行查找              x:空白字符除了呗转移或在字符类中意外的完全被忽略              s:匹配所有的字符(圆点”.“)包括换行内容        如果直接使用(javascript),那么只能使用i与m(常用),而s与x必须使用$regex(基本用不到)    16.2 查询name上包含”谷“的人      db.students.find({"name":/谷/)   #这里要注意 /谷/ 不能加”“      db.students.find({"name":/a/i)   #name包含字母A、a,i:不区分大小写      db.students.find({"name":{"$regex":/a/}})   #与上面一致、写法不同     16.3 正则查询数组数据      db.students.find({"course":/语/}) #查询课程中带“语”的      db.students.find({"course":/语?/})  # ”?:是占位符,只能写后面不能写前面,与传统正则不同17、数据排序(升序:1 、降序:-117.1 根据成绩降续 : db.students.find().sort({"score":-1})     17.2 自然排序(按照保存进去的顺序倒叙) :db.students.find().sort({"$natural":-1}) 18、数据分页      skip(n):相当于sql中的offset,跳过多少个      limit(n)      18.1 根据age降续分页        db.students.find().skip(0).limit(5).sort({"age":-1})19、数据更新(更新函数):save、update    19.1 update语法:db.集合.update(条件,更新的数据,upsert,multi)        upsert:更新的数据不存在,则新加一条,true为增加,false不增加        multi:表示是否只更新到查询出来的第一条数据,false只更新第一个,true全部更新        eg:将年龄是19岁的人成绩都更新到100分(会返回多条数据)        只更新第一条数据:db.students.update({"age":19},{"$set":{"score":100},false,false})        更新所有:db.students.update({"age":19},{"$set":{"score":100},false,true})        不存在插入:db.students.update({"age":190},{"$set":{"score":100}},true,false)        $set:修改器,不止能改数据,还能改集合等     19.2 save:db.集合.save({条件,更新数据})          修改存在的数据:db.students.save({"age":190,score:0})        修改不存在的数据:db.students.save({"age":191,score:0})  #数据不存在,默认就添加一条      【注】:多用update灵活20、修改器    20.1 $inc : 主要针对于一个数字字段,增加数字字段的内容         语法  :{"$inc":{"成员":"内容"}}         例子:将所有19岁人成绩减少30分、年龄+1岁            db.students.update({"age":19},{"$inc":{"score": -30,age : +1}})
原创粉丝点击