1.mongodb的基础概念介绍
database | 数据库 |
collection /table | 集合,类似于mysql中的表 |
filed | 类似于mysql中字段 |
document | 每行的记录 |
1.1查询所有的库
默认自带三个库,mongo客户端的命令示功能,可以使用tab键能自动补全。
> show dbs; #或者 show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
mongo客户端提供一个正确关闭mongodb服务器的方法,之前单机的时候我们用的是kill方法,该方法会让一些数据不能存到磁盘中。
use admin
db.shutdownServer() #关闭服务
1.2mongodb创建库、创建集合、插入数据(key value的字典方式插入)
> use bfd #use即可,无需显式创建数据库
> db.myuser.insert({ name: '张三', age:18 }) #这里我们不需要显示创建collection,其中name、age为filed,张三、18为值
> show dbs;
> show collections;
我们可以看到所有的数据库和集合。
1.3查询所有数据
> use bfd
> db.myuser.find() #查询所有数据
> db.myuser.find( { name: '张三' } ) #根据name值查找
> db.myuser.find( { age: 26 } ) #根据age值查找
1.4删除集合数据
use shijiange;
db.myuser.remove({ name: '张三' }) #根据name值删除
db.myuser.find()
db.myuser.remove( {} ) #删除数据
db.myuser.drop() #删除集合
1.5更新集合数据
use bfd;
db.myuser.update({ age: 18 }, {$set: { age: 30 }})
1.6删除数据库,mongodb自带的三个库不要动
use bfd
db.dropDatabase()
1.7limit限制条数查询
db.myuser.find()
db.myuser.find().limit(2) #查看前面两条记录
1.8使用skip跳过记录
db.myuser.find().skip(2).limit(2)
1.9使用sort进行排序
db.myuser.find().sort({ age: 1 }) #按age升序
db.myuser.find().sort({ age: -1 }) #按age降序
1.10根据字段进行数字比较查询
db.myuser.find({ age: {$lt: 30} })
$gt | 大于 |
$lt | 小于 |
$gte | 大于或等于 |
$lte | 小于或等于 |
1.11查询多种条件的组合
db.myuser.find( {name: '李四'} )
db.myuser.find({ $or: [ {name: '张三'},{name: '李四'} ] })
db.myuser.find({ $and: [ {name: '张三'},{age: 18} ] })
2.索引查询和建立
mongodb数据准备,创建50w条数据。
use bfd
for(i=1; i<=500000;i++){
db.myuser.insert( {name:'mytest'+i, age:i} )
}
重新打开一个mongodb的客户端
mongodb有慢查询的概念,默认是超过100ms会记录慢日志mongodb.log
db.getProfilingStatus()
当数据插入完毕后,我们查询一条记录,看看查询所花费的时间,在日志中可以查看到。
> db.myuser.find( {age:9999} )
{ "_id" : ObjectId("5c033fff0fe7f1bc924be979"), "name" : "mytest9999", "age" : 9999 }
我们可在日志中看到查询一条记录所花的时间为282ms。
我们也可以在客户端查看执行的过程。
db.myuser.find( {age:9999} ).explain(true)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "bfd.myuser",
"indexFilterSet" : false,
"parsedQuery" : {
"age" : {
"$eq" : 9999
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"age" : {
"$eq" : 9999
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 284, #执行所花费的时间
"totalKeysExamined" : 0,
"totalDocsExamined" : 500000,
"executionStages" : {
"stage" : "COLLSCAN", #全表查询,所以速度慢
"filter" : {
"age" : {
"$eq" : 9999
}
},
"nReturned" : 1,
"executionTimeMillisEstimate" : 260,
"works" : 500002,
"advanced" : 1,
"needTime" : 500000,
"needYield" : 0,
"saveState" : 3906,
"restoreState" : 3906,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 500000
},
"allPlansExecution" : [ ]
},
"serverInfo" : {
"host" : "bgsbtsp0006-dqf",
"port" : 27017,
"version" : "4.0.3",
"gitVersion" : "7ea530946fa7880364d88c8d8b6026bbc9ffa48c"
},
"ok" : 1
}
获取当前索引,默认有_id的索引,所以用_id查是比较快。
db.myuser.ensureIndex( {age:1} ) #增加age的升序索引
然后我们再查询年龄为9999的记录,看一下查询所花费的时间。
> db.myuser.find( {age:9999} ).explain(true)
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "bfd.myuser",
"indexFilterSet" : false,
"parsedQuery" : {
"age" : {
"$eq" : 9999
}
},
....
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 2, #查看所花费时间为2ms
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "FETCH",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
......
},
"serverInfo" : {
"host" : "bgsbtsp0006-dqf",
"port" : 27017,
"version" : "4.0.3",
"gitVersion" : "7ea530946fa7880364d88c8d8b6026bbc9ffa48c"
},
"ok" : 1
}
>
所以建立索引,查询速度会非常明显。
删除索引
db.myuser.dropIndex( {age:1} ) #删除索引
使用正则的话,索引无效果
db.myuser.find( {"name":"mytest1"} )
db.myuser.ensureIndex( {name:1} ) #添加索引
db.myuser.find( {"name":"mytest6"} )
db.myuser.find( {"name":/99999/} )
db.myuser.find( {"name":/99999/} ).explain(true) #使用正则,全表扫描,也是慢
mongodb建立唯一索引,唯一索引对应的值不能重复
use bfd
db.myuser.insert( {userid:1} )
db.myuser.insert( {userid:1} )
db.myuser.remove({}) #清空数据
db.myuser.ensureIndex( {userid:1},{unique:true} ) #创建唯一索引
db.myuser.insert( {userid:1} )
db.myuser.insert( {userid:2} )
db.myuser.insert( {userid:1} ) #因为是唯一索引,所以会报错