mongo常用操作

mogodb

1、brew install mongodb
2、启动mongo服务  mongod -config /usr/local/etc/mongod.conf
3、/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  #绑定的ip

4、切换到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,余数是1

11 、范围查询($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}})

















你可能感兴趣的:(mongo)