【MongoDB】2.0 语句使用

mongodb内部用的JavaScript的引擎。

image.png
切换数据库
 use admin

image.png

mongodb会自动创建数据库只需要用use关键字即可,但是使用后不会立即看到数据库,需要向其中插入数据,才会完成自动创建。

image.png
db.user.insert({id:1,name:'zhudong' })
image.png
查看表
 show tables
image.png

或者使用

show collections
image.png

image.png
删除表(集合)
db.user.drop()

成功删除返回true,否则返回false。


image.png

image.png
删除数据库:

首先需要先切换到该数据库,然后用

db.dropDatabase()

删除该数据库。


image.png

mongodb存储文档结构类似于json结构,称之为bson (BinaryJSON)

mongodb新增数据有两个方法——save、insert,效果是一样的
use testdb
db.user.insert({id:1,name:'wuxun',age:'18'})
db.user.save({id:2,name:'luoyanwei',age:'20'})
 db.user.find()
image.png
mongodb可以插入空数据
 db.user.insert({})
 db.user.find()
image.png
更新数据
image.png

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
db.user.update({id:1},{$set:{age:25}})
db.user.find()
image.png

如果以如下语句进行修改,则会发生覆盖现象(删掉其他的字段内容):

db.user.update({id:1},{age:25})
db.user.find()

image.png

所以一定不要忘记使用$set

当然,不存在字段,相当于无法匹配到任何一条数据:


image.png

可以看到我们的匹配nmatched为0。
更新一个不存在的字段时,会新增一个字段。

db.user.update({id:2},{$set:{sex:1}})
db.user.find()
image.png

如果找不到条件数据,也不会修改字段:

db.user.update({id:5},{$set:{age:80}})
db.user.find()
image.png

如果设置第一个参数为true,则会新增数据(upsert)

db.user.update({id:3},{$set:{age:80}},true)
db.user.find()
image.png
删除数据
image.png

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。(很少使用)
db.user.remove({age:25})
db.user.find()
image.png

继续做假数据:

db.user.insert({id:4,name:'wuxun',age:'18'})
db.user.insert({id:5,name:'wuxun',age:'18'})
db.user.insert({id:6,name:'wuxun',age:'18'})
db.user.insert({id:7,name:'wuxun',age:'20'})
db.user.find()
image.png

如下操作,会找到3条数据,但只会删除第一条数据:

db.user.remove({age:'18'},true)
db.user.find()
image.png

删除表内所有数据:

db.user.remove({})
db.user.find()
image.png

为了简化操作,mongodb官方新版本建议使用deleteOne()与deleteMany()进行删除数据操作

db.user.deleteOne({id:1})
db.user.deleteMany({}) #删除所有数据
image.png

image.png

image.png
查询数据
image.png
  • query :可选,使用查询操作符指定查询条件
  • fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式:

db.col.find().pretty()
操作 格式 范例 RDBMS中的类似语句
等于 {<key>:<value> } db.col.find({"by":"内容"}).pretty() where by = '内容'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <=50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >=50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes !=50

插入数据和查询所有:

#插入测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})
db.user.find() #查询全部数据
image.png

image.png
db.user.find().count() #查询数据条数
db.user.find({id:1}) #查询id为1的数据
db.user.find({age:{$lte:21}}) #查询小于等于21的数据
db.user.find({age:{$lte:21}, id:{$gte:2}}) #and查询,age小于等于21并且id大于等于2
db.user.find({$or:[{id:1},{id:2}]}) #查询id=1 or id=2
#分页查询:Skip()跳过几条,limit()查询条数
db.user.find().limit(2).skip(1) #跳过1条数据,查询2条数据
db.user.find().sort({id:-1}) #按照age倒序排序,-1为倒序,1为正序
image.png

image.png

通过2个值的组合达到分页查询的效果


image.png
索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

#查看索引
 db.user.getIndexes()
#说明:1表示升序创建索引,-1表示降序创建索引。

image.png

V:代表版本
key中的_id表示索引字段,数字1表示升序排序。
name:索引的名字
ns:命名空间

创建索引
#创建索引
> db.user.createIndex({'age':1})
image.png

查看


image.png

删除索引

#删除索引
db.user.dropIndex("age_1")
#或者,删除除了_id之外的索引
db.user.dropIndexes()
image.png
#创建联合索引
db.user.createIndex({'age':1, 'id':-1})
image.png
#查看索引大小,单位:字节
db.user.totalIndexSize()
image.png

单位:字节(Bit)

执行计划

MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具。

#插入1000条数据
for(var i=1;i<1000;i++)db.user.insert({id:100+i,username:'name_'+i,age:10+i})
image.png
#查看执行计划
db.user.find({age:{$gt:100},id:{$lt:200}}).explain()
image.png

image.png

image.png
"winningPlan" : { #最佳执行计划
"stage" : "FETCH", #查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、
FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询

END