MongDB基本语句

来源:互联网 发布:java岗前培训靠谱吗 编辑:程序博客网 时间:2024/04/29 18:53

文档 组成 集合;集合 组成 数据库。
文档 如同python中dict.
数据库操作是使用JavaScript shell进行操作

数据库操作

  • 查看所有数据库
    show dbs
  • use 切换数据操作,也是创建数据库命令
    use test
  • 数据库删除
    db.dropDatabase()
  • 查看集合
    show collections显示所有数据库中的集合,或者show tables
  • insert 数据创建
    post = {"title":"My Blog Post","content":"Here's my blog post.","date":new Date()}
    db.blog.insert(post)
    1. 批量插入
      batchInsert([{name:Jack,sex:male},{name:Bob,age:25},{name:Rose,age:23},{name:Dan,age:36}])
    2. save(),如果如果有相同id的,直接进行替代操作,而insert则会报错。
  • find()/findOne() 数据读取
    db.blog.find()
    db.test_collection.find().count() //查看数据条数
    db.test_collection.find().skip(3).limit(2).sort({x:1})//跳过前三条,限制条数为2,并以x排序
  • update() 数据更新
    至少接受两个参数(一个限定条件,一个新文档)
    post.comments = [] //改值
    db.blog.update({title:"My Blog Post"},post) //更新
    db.blog.update({title:"My Blog Post"},{$set:{"content":"U R my boby!"}}) //用$set{}进行部分更新
    db.blog.update({title:"My Blog Week"},{title:"My Blog Week","content":"My weekday very happy!"},true) //实现update insert操作,不存在的数据自动插入
    update 默认只更改查找到的第一条信息,更新查到的所有数据用:
    update({x:1},{$set:{x:2}},false,true)
    db.blog.find() //查看
  • remove() 数据删除
    在没有条件限定时,会将集合中的所有数据全部永久删除
    db.blog.remove({title:"My Blog Post"})
    (数据库集合清空:db.collection.drop()和删除一个文档的时间差不多)

数据类型

与JavaScript中对象相近,类似于JSON。
1. null。用于表示空值或者不存在的字段:
{"x" : null}
2. 布尔型
{“x" : true}
3. 数值
默认64位浮点型数值;但可以用NumberInt(4字节整数)和NumberLong(8字符带符号整数);
{"x": 3.14}
{"y":NumberInt("3")}
{"z":NumberLong("3")}
4. 字符串
{"x": "slie"}
4. 日期
{"t": new Date()}
5. 正则表达式
查询时使用正则表达式作为限定条件。
{"x": /foobar/i}
6. 数组
{"x": ["a", "b", "c"]}
7. 内嵌文档
{"x": {"y":"foober"}}
8. 对象id
一个12字节的ID,是文档的唯一标识。
{"x" :ObjectId()}

索引

数据量较大时,使用索引可以大大加快查询速度。

  • 查看索引
    db.test_collection.getIndexes()
  • 创建索引
    db.test_collection.ensureIndex({x:1})

索引种类

  • _id 索引(自动创建)
  • 单键索引(比较变通的索引,不会自动创建)
  • 多键索引(与单。。区别在于字段的值是单一,还是数组)
    db.test_collection.ensureIndex({x:1})
    db.test_collection.insert({x:[1,4,5,4]}) //就成了多键索引
  • 复合索引(当查询条件不只一个时,就需要建立复合索引)
    db.collection.ensureIndex({x:1,y:1})
  • 过期索引(一段时间会过期,相应数据也会被删除)
    比较适合登录信息和日志信息。
    db.collection.ensureIndex({time:1},{expireAfterSeconds:10})
    存储在过期索引的值必须是指定的时间类型,必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除 ;如果ISODate是数组,则最小时间进行删除;不能是复合索引;删除时间是不精确的(每60s跑一次,删除也要一些时间)。
  • 全文索引(对字符串与字符串数组创建全文可搜索的索引)
    适用情况:{author:”“,title:”“,article:”“}
    db.articles.ensureIndex({key:"text"})
    db.articles.ensureIndex({key1:"text",key2:"text"})
    db.articles.ensureIndex({key:"text"})
    查询:
    db.articles.find({$text:{$search:"coffee"}})
    db.articles.find({$text:{$search:"aa bb cc"}}) //或查询
    db.articles.find({$text:{$search:"aa bb -cc"}}) //不包含cc串
    db.articles.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}}) //与查询语句,用引号(这里要用斜线转义)
    与百度查询相同,相似度越大的在前面的查询(使用$meta):
    {score:{$meta:"textScore"}}
    db.articles.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})查询数据中多了一个score字段,表示相似度
    进行排序:
    db.articles.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
    使用限制:每次查询只能指定一个texttext查询不能出现在nortext,hint不再起作用(强制指定使用某索引进行性能测试);不支持中文。
  • 地理位置索引
    将一些点的位置存储在MongoDB中,创建索引后,可以按照位置来查找其他点。
    子分类:

    1. 2d索引,用于存储和查找平面上的点;
      查找方式:
      a. 查找距离某个点一定距离内的点。
      ensureIndex({w:"2d"}) //创建
      经度[-180,180]纬度[-90,90]
      insert({w:[1,1]}) //插入数据
      find({w:{$near:[1,1]}}) //与[1,1]距离最近的点
      find({w:{$near:[1,1],$maxDistance:10}}) // 设置最大距离范围
      b. 查找包含在某个区域内的点。
      find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}}) //在矩形中的点
      find({w:{$geoWithin:{$center:[[0,0],4]}}}) //在圆中的点
      find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}}) //在多边形中的点
      geoNear查询:
      db.runCommand({geoNear:<collection>,near:[x,y],minDistance:d1,maxDistance:d2,num:n1(返回数目)})
      db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:2})

    2. 2dsphere索引,用于存储和查找球面上的点。
      ensureIndex({w:"2dsphere"})
      {type:" ",coordinates:[<coodinates>]} //位置表示
      查询与2d类似,并且支持$minDistance 与 $maxDistance,还支持交叉点

索引属性

  • name
    一般索引 x_1 或x_-1//升序与降序 ;复合索引为x_1_y_-1;可能超125字节限制自定义索引名字:ensureIndex({x:1,y:1,z:1,m:1},{name:"normal_index
  • 唯一性,unique指定:
    ensureIndex({},{unique:true/false})
  • 稀疏性,sparse指定(在不包括索引数据中不必创建索引,节约空间,增大查询速度):
    ensureIndex({},{sparse:true})
    但在$exists(用于查找一个字段存在与不存在的数据)中出现隐患
    find({m:{$exists:true}}) //只查找m存在的字段
    不能在稀疏索引上查找不存在的记录。
  • 是否定期删除,expireAfterSeconds指定:
    TTL,过期索引

索引构建情况分析

  • 好处:加快索引相关的查询。
  • 劣势:增加磁盘空间消耗,降低写入性能。

评判当前索引构建情况

  • mongostat工具
    mongostat -h 127.0.0.1:12345
    其中 idx miss 较高,就说明创建了不合适的索引
    各指标含义:
    inserts/s 每秒插入次数
    query/s 每秒查询次数
    update/s 每秒更新次数
    delete/s 每秒删除次数
    getmore/s 每秒执行getmore次数
    command/s 每秒的命令数,比如count
    flushs/s 每秒执行fsync将数据写入硬盘的次数。
    mapped/s 所有的被mmap的数据量,单位是MB,
    vsize 虚拟内存使用量,单位MB
    res 物理内存使用量,单位MB
    faults/s 每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展
    locked % 被锁的时间百分比,尽量控制在50%以下吧
    idx miss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了
    q t|r|w 当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。
    conn 当前连接数
    time 时间戳
    Mongodb良好运行标示:
    insert query update delete 较稳定,这4列数据越大说明性能越高,如果运行一定时间后,指标骤减,说明程序处理存在问题。
    faults越小越好,越小说明操作失败率越低;
    idx miss越小越好,越小说明索引命中率越高,Mongodb索引非常重要;
    netin/netout 数据越大越好,越大说明进出数据交换越大。
  • profile集合介绍
    db.getProfilingLevel() //有0关闭,2开启,1记录超过slowms值的操作
    db.getProfilingStatus()// { "was" : 0, "slowms" : 100 }
    设置db.setProfilingLevel(2)//开启,会生成一个system.profile文档
    db.system.profile.find().sort({$natural:-1}).limit(1)
    开启后会影响到数据库的性能,只适用于系统的测试阶段和刚刚上线时观察阶段。
  • 日志介绍
    在配置文件mongod.conf下verbose=vvvvvverbose值可以是一个v到五个v.详细程度逐渐提高
  • explain分析
    find({x:1}).explain()可以查询你的查询是否用了索引和查询时间,以及扫描数量。

安全

  • 开启
    1. auth开启
      在mongod.conf中加入auth = true
      查找mongod服务:ps -ef|grep mongod|grep 12345
      停止mongod服务:kill pid
      创建用户:createUser({user:"<name>",pwd:" ",customData:{"用户说明"},roles:[{role:"<role>",db:"<database>"}]})
      1.角色类型:read,readWrite,dbAdmin,dbOwner,userAdmin
      createUser({user:"testAdmin",pwd:"mongotest",customData:{"testAdmin"},roles:[{role:"userAdmin",db:"admin"},{role:"read",db:"test"}]})
      2.集群角色(clusterAdmin,clusterManager…)
      3.备份角色(backup,restore…)
      4.其他特殊权限(DBAdminAnyDatabase…)
      创建角色:creatRole()
      { _id: "myAPP.appUser,role:"appUser",db:"myApp",
      privileges:[
      {resource :{db:"myApp",collection:" "},actions:["find","createCollection","dbStats","collStats"]}
      {resource :{db:"myApp",collection:"logs"},actions:["insert"]}
      {resource :{db:"myApp",collection:"data"},actions:["insert","update","remove","compact"]}
      {resource :{db:"myApp",collection:"system.indexes"},actions:["find"]}
      {resource :{db:"myApp",collection:"system.namespaces"},actions:["find"]}
      ],roles:[]}
    2. keyfile开启
原创粉丝点击