zoukankan      html  css  js  c++  java
  • mongoDB(2)--mongoDB的常用命令

    默认设置后台启动:

    vi mongodb.cfg 创建配置文件,配置启动信息

    dbpath=/root/mongodb/data
    logpath=/root/mongodb/log/mongodb.log
    fork=true
    storageEngine=mmapv1指定引擎  

    [root@localhost mongodb]# mongod -f mongodb.cfg  命令指定配置文件启动

    ps -aux | grep mongod 查看一下mongod当前进程

    [root@localhost mongodb]# ps -aux | grep mongod
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    root      4722  0.2  4.1 249888 42724 ?        Sl   07:07   0:00 mongod -f mongodb.cfg
    root      4755  0.0  0.0   4356   724 pts/1    S+   07:11   0:00 grep mongod
    

    常用mongodb命令:

    2.3、MongoDB 常用命令
    1、创建数据库
    use testdb
    2、创建集合
    db.t_member.insert({name:"zhaomin",age:23})
    3、查询
    db.t_member.find()
    db.t_member.findOne()
    4、修改
    #不会影响其他属性列 ,主键冲突会报错
    db.t_member.update({name:"zhaomin"},{$set:{age:18}})
    #第三个参数为 true 则执行 insertOrUpdate 操作,查询出则更新,没查出则插入,
    或者
    db.t_member.update({name:"zhaomin"},{$set:{age:18}},true)
    5、删除
    #删除满足条件的第一条 只删除数据 不删除索引
    db.t_member.remove({age:1})
    #删除集合
    db.t_member.drop();
    #删除数据库
    db.dropDatabase();
    6、查看集合
    show collections
    7、查看数据库
    show dbs
    8、插入数据
    db.t_member.insert() #不允许键值重复
    db.t_member.save() #若键值重复,可改为插入操作
    9、批量更新
    db.t_member.update({name:"zhaomin"},{$set:{name:"zhanmin11"}},false,t
    rue);
    批量操作需要和选择器同时使用,第一个 false 表示不执行 insertOrUpdate 操作,第二个 true 表示
    执行批量
    10、更新器使用$set : 指定一个键值对,若存在就进行修改,不存在则添加
    $inc :只使用于数字类型,可以为指定键值对的数字类型进行加减操作:
    db.t_member.update({name:"zhangsan"},{$inc:{age:2}})
    执行结果是名字叫“zhangsan”的年龄加了 2
    $unset : 删除指定的键
    db.t_member.update({name:"zhangsan"},{$unset:{age:1}})
    $push : 数组键操作:1、如果存在指定的数组,则为其添加值;2、如果不存在指定的数组,则
    创建数组键,并添加值;3、如果指定的键不为数组类型,则报错;
    $addToSet : 当指定的数组中有这个值时,不插入,反之插入
    #则不会添加到数组里
    db.t_member.update({name:"zhangsan"},{$addToSet:{classes:"English"}})
    ;
    $pop:删除指定数组的值,当 value=1 删除最后一个值,当 value=-1 删除第一个值
    #删除了最后一个值
    db.t_member.update({name:"zhangsan"},{$pop:{classes:1}})
    $pull : 删除指定数组指定的值
    #$pullAll 批量删除指定数组
    db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}})
    #若数组中有多个 Chinese,则全删除
    db.t_member.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}})
    $ : 修改指定数组时,若数组有多个对象,但只想修改其中一些,则需要定位器:
    db.t_member.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male
    "}})
    $addToSet 与 $each 结合完成批量数组更新操作
    db.t_member.update({name:"zhangsan"},{$set:{classes:{$each:["chinese"
    ,"art"]}}})
    runCommand 函数和 findAndModify 函数
    runCommand({
    findAndModify:"persons",

    query:{查询器},
    sort:{排序},
    update:{修改器},
    new:true 是否返回修改后的数据
    });
    runCommand 函数可执行 mongdb 中的特殊函数
    findAndModify 就是特殊函数之一,用于返回执行返回 update 或 remove 后的文档
    例如:
    db.runCommand({
    findAndModify:"persons",
    query:{name:"zhangsan"},
    update:{$set:{name:"lisi"}},
    new:true
    })
    12、高级查询详解
    db.t_member.find({},{_id:0,name:1})
    第一个空括号表示查询全部数据,第二个括号中值为 0 表示不返回,值为 1 表示返回,默认情况下若不
    指定主键,主键总是会被返回;
    db.persons.find({条件},{指定键});
    比较操作符:$lt: < $lte: <= $gt: > $gte: >= $ne: !=
    12.1、查询条件
    #查询年龄大于等于 25 小于等于 27 的人
    db.t_member.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1})
    #查询出所有国籍不是韩国的人的数学成绩

    db.t_member.find({country:{$ne:"韩国"}},{_id:0,name:1,country:1})
    12.2、包含与不包含(仅针对于数组)
    $in 或 $nin
    #查询国籍是中国或美国的学生信息
    db.t_member.find({country:{$in:["China","USA"]}},{_id:0,name:1:countr
    y:1})
    12.3、$or 查询
    #查询语文成绩大于 85 或者英语大于 90 的学生信息
    db.t_member.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1})
    #把中国国籍的学生上增加新的键 sex
    db.t_member.update({country:"China"},{$set:{sex:"m"}},false,true)
    #查询出 sex 为 null 的人
    db.t_member.find({sex:{$in:[null]}},{_id:0,name:1,sex:1})
    12.4、正则表达式
    #查询出名字中存在”li”的学生的信息
    db.t_member.find({name:/li/i},{_id:0,name:1})
    12.5、$not 的使用
    $not 和$nin 的区别是$not 可以用在任何地方儿$nin 是用到集合上的
    #查询出名字中不存在”li”的学生的信息
    db.t_member.find({name:{$not:/li/i}},{_id:0,name:1})
    12.6、$all 与 index 的使用
    #查询喜欢看 MONGOD 和 JS 的学生
    db.t_member.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1})
    #查询第二本书是 JAVA 的学习信息
    db.t_member.find({"books.1":"JAVA"},{_id:0,name:1,books:1})
    12.7、$size 的使用,不能与比较查询符同时使用
    #查询出喜欢的书籍数量是 4 本的学生

    db.t_member.find({books:{$size:4}},{_id:0,name:1})
    12.8、查询出喜欢的书籍数量大于 4 本的学生本的学生
    1)增加 size 键
    db.t_member.update({},{$set:{size:4}},false,true)
    2)添加书籍,同时更新 size
    db.t_member.update({name:"jim"},{$push:{books:"ORACL"},$inc:{size:1}
    })
    3)查询大于 3 本的
    db.t_member.find({size:{$gt:4}},{_id:0,name:1,size:1})
    12.9、$slice 操作符返回文档中指定数组的内部值
    #查询出 Jim 书架中第 2~4 本书
    db.t_member.find({name:"jim"},{_id:0,name:1,books:{$slice:[1,3]}})
    #查询出最后一本书
    db.t_member.find({name:"jim"},{_id:0,name:1,books:{$slice:-1}})
    12.10、文档查询
    查询出在 K 上过学且成绩为 A 的学生
    1)绝对查询,顺序和键个数要完全符合
    db.t_member.find({school:{school:"K","score":"A"}},{_id:0,name:1})
    2)对象方式,但是会出错,多个条件可能会去多个对象查询
    db.t_member.find({"school.school":"K","school.score":"A"},{_id:0,nam
    e:1})
    正确做法单条条件组查询$elemMatch
    db.t_member.find({school:{$elemMatch:{school:"K",score:"A"}},{_id:0,n
    ame:1})
    db.t_member.find({age:{$gt:22},books:"C++",school:"K"},{_id:0,name:1,

    age:1,books:1,school:1})
    12.11、分页与排序
    1)limit 返回指定条数 查询出 persons 文档中前 5 条数据:
    db.t_member.find({},{_id:0,name:1}).limit(5)
    2)指定数据跨度 查询出 persons 文档中第 3 条数据后的 5 条数据
    db.t_member.find({},{_id:0,name:1}).limit(5).skip(3)
    3)sort 排序 1 为正序,-1 为倒序
    db.t_member.find({},{_id:0,name:1,age:1}).limit(5).skip(3).sort({age:
    1})
    注意:mongodb 的 key 可以存不同类型的数据排序就也有优先级
    最小值->null->数字->字符串->对象/文档->数组->二进制->对象 ID->布尔->日期->时间戳->正则
    ->最大值
    12.12、游标
    利用游标遍历查询数据
    var persons = db.persons.find();
    while(persons.hasNext()){
    obj = persons.next();
    print(obj.name)
    }
    游标几个销毁条件
    1).客户端发来信息叫他销毁
    2).游标迭代完毕
    3).默认游标超过 10 分钟没用也会别清除
    12.13、查询快照
    快照后就会针对不变的集合进行游标运动了,看看使用方法.

    #用快照则需要用高级查询
    db.persons.find({$query:{name:”Jim”},$snapshot:true})
    高级查询选项
    1)$query
    2)$orderby
    3)$maxsan:integer 最多扫描的文档数
    4)$min:doc 查询开始
    5)$max:doc 查询结束
    6)$hint:doc 使用哪个索引
    7)$explain:boolean 统计
    8)$snapshot:boolean 一致快照
    14.1、查询点(70,180)最近的 3 个点
    db.map.find({gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3)
    14.2、查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点
    db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})
    14.3、查询出以圆心为(56,80)半径为 50 规则下的圆心面积中的点
    db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:1})
    15、Count+Distinct+Group
    15.1、count 查询结果条数
    db.persons.find({country:"USA"}).count()
    15.2、Distinct 去重
    请查询出 persons 中一共有多少个国家分别是什么
    #key 表示去重的键
    db.runCommand({distinct:"persons",key:"country"}).values
    15.3、group 分组
    db.runCommand({ group:{
      ns:"集合的名字",
      key:"分组键对象",
      initial:"初始化累加器",
      $reduce:"分解器",
      condition:"条件",
      finalize:"组完成器"
      }})
    分组首先会按照 key 进行分组,每组的 每一个文档全要执行$reduce 的方法,他接收 2 个参数一个是组
    内本条记录,一个是累加器数据. 请查出 persons 中每个国家学生数学成绩最好的学生信息(必须在 90 以上)
    db.runCommand({
    group:{
    ns:"persons",
    key:{"country":true},
    initial:{m:0},
    $reduce:function(doc,prev){
    if(doc.m>prev.m){
    prev.m = doc.m;
    prev.name = doc.m;
    prev.country = doc.country;
    }
    },
    condition:{m:{$gt:90}},
    finalize:function(prev){
    prev.m = prev.name+" comes from "+prev.country+" ,Math score is
    "+prev.m;
    }
    }
    })
    15.4.函数格式化分组键
    如果集合中出现键 Counrty 和 counTry 同时存在
    $keyf:function(doc){
    if(doc.country){
    return {country:doc.country}
    }
    return {country:doc.counTry}
    }
    16、常用命令举例
    16.1、查询服务器版本号和主机操作系统
    db.runCommand({buildInfo:1})
    16.2、查询执行集合的详细信息,大小,空间,索引等
    db.runCommand({collStats:"persons"})
    16.3、查看操作本集合最后一次错误信息
    db.runCommand({getLastError:"persons"})
    17、固定集合
    17.1、特性
    固定集合默认是没有索引的就算是_id 也是没有索引的
    由于不需分配新的空间他的插入速度是非常快的
    固定集合的顺是确定的导致查询速度是非常快的
    最适合就是日志管理
    17.2、创建固定集合
    创建一个新的固定集合要求大小是 100 个字节,可以存储文档 10 个
    db.createCollection("mycoll",{size:100,capped:true,max:10})
    把一个普通集合转换成固定集合
    db.runCommand({convertToCapped:"persons",size:1000})
    17.3、对固定集合反向排序,默认情况是插入的顺序排序
    db.mycoll.find().sort({$natural:-1})

     

    MongoDB命令怎么学?
    记住用help
    有些人,自认为很聪明,他就回去猜(就会按自己的习惯去猜)

    mongodb图形化工具---robomongo-0.9.0

    创建新库,并往新表中插入一条数据

    > use testdb
    switched to db testdb
    > db.member.insert({name:"lf",age:18.addr:"hunan chuangsha"});
    2019-04-23T22:24:11.023+0800 E QUERY [js] SyntaxError: identifier starts immediately after numeric literal @(shell):1:32
    > db.member.insert({name:"lf",age:18,addr:"hunan chuangsha"});
    WriteResult({ "nInserted" : 1 })

     循环插入60条数据

    > for(var i=18;i<=60;i++){ db.member.insert({name:"lf",age:i,addr:"hunan chuangsha"});}

    直接drop(),就这样没有了
    不靠谱

    定位:缓存而已(如果把安全性非常高数据库不靠谱)

  • 相关阅读:
    从零开始入门 K8s | 应用编排与管理
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    203. Remove Linked List Elements
    183. Customers Who Never Order
    182. Duplicate Emails
    181. Employees Earning More Than Their Managers
    1261. Find Elements in a Contaminated Binary Tree
    1260. Shift 2D Grid
  • 原文地址:https://www.cnblogs.com/flgb/p/10759277.html
Copyright © 2011-2022 走看看