MongoDB 数据库
基本操作
启动
mongod
mongo
基本操作
-
查看数据库
show databases
-
选择数据库
use 数据库名称
- 隐式创建;当选择不存在的数据库时不会报错,后期当该数据库有数据时,系统会自动创建
-
查看集合
show collections
(集合名称为复数(末尾加s))
-
创建集合
db.create集合名称('集合名')
- (集合名称与 create 相连且为驼峰式书写)
-
删除集合
db.集合名.drop()
<-- 查看集合 -->
> show collections
users
<-- 创建集合 -->
> db.createCollection('test1')
{ "ok" : 1 }
> db.createCollection('test2')
{ "ok" : 1 }
> show collections
test1
test2
users
<-- 删除集合 -->
> db.test1.drop()
true
> show collections
test2
users
- 删除数据库
- 通过 use 语法选中数据库
- 通过 db.dropDatabase() 删除数据库
MongoDB 文档增删改查(CURD)
新增( insert )
-
语法:
db.集合名.insert(JSON数据)
-
集合存在->则直接插入数据,集合不存在->隐式创建
-
练习:在 test2 数据库的c1 集合中插入数据(姓名:webopenfather,年龄:18)
-
·数据库和集合如果不存在,都会隐式自动创建
-
·当插入数据时,给对象中的变量名可以不加引号,但是查看集合数据时系统会自动加
-
当成功插入一条数据后,mongodb 会给每条数据增加一个唯一的—id 键
-
一次性插入多条数据(数组中写一个JSON数据即可)
db.c1.insert([ {name:"Zip",age:12}, {name:"Jarry",age:18}, {name:"Zoom",age:15}, ])
-
插入很多条数据时
-
mongodb 底层使用 JS 引擎实现的,所以支持部分 js 语法
-
因此可以写 for 循环
for(var i = 1;i <= 10;i ++){ db.c1.insert({ uname:"a"+i,age:i }) }
-
-
查询 ( find() )
-
语法:
db.集合名.find({
条件},{
查询的列})
-
传入参数的使用方法:
条件 查询所有数据 {},或不写 查询 age = 6 的数据 {age:6} 查询 age = 6 且 sex = 男 数据 {age:6,sex:‘男’} 查询的列 (可选参数) 查询全部数据 不写 只显示 age 列(字段) { age:1 } 除了 age 字段不显示 { age:0 } // 练习 > db.test3.find({uname:"a3"}) { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3", "age" : 3 } > db.test3.find({uname:"a3"},{age:1}) { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "age" : 3 } > db.test3.find({uname:"a3"},{age:0}) { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3" } > db.test3.find({uname:"a3"},{}) { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3", "age" : 3 }
-
按条件查询语法:
db.集合名.find({字段名:{运算符:值}})
运算符 作用 $gt 大于 $gte 大于等于 $lt 小于 $lte 小于等于 $ne 不等于 $in in $nin not in -
练习
// 查询年龄大于 5 的数据 > db.test3.find({age:{$gt:5}}) { "_id" : ObjectId("605a88ea18656b38335fbe62"), "uname" : "a6", "age" : 6 } { "_id" : ObjectId("605a88ea18656b38335fbe63"), "uname" : "a7", "age" : 7 } { "_id" : ObjectId("605a88ea18656b38335fbe64"), "uname" : "a8", "age" : 8 } { "_id" : ObjectId("605a88ea18656b38335fbe65"), "uname" : "a9", "age" : 9 } { "_id" : ObjectId("605a88ea18656b38335fbe66"), "uname" : "a10", "age" : 10 } // 查询年龄小于 5,并且只显示 uname 字段 > db.test3.find({age:{$lte:6}},{uname:1}) { "_id" : ObjectId("605a88ea18656b38335fbe5d"), "uname" : "a1" } { "_id" : ObjectId("605a88ea18656b38335fbe5e"), "uname" : "a2" } { "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a3" } { "_id" : ObjectId("605a88ea18656b38335fbe60"), "uname" : "a4" } { "_id" : ObjectId("605a88ea18656b38335fbe61"), "uname" : "a5" } { "_id" : ObjectId("605a88ea18656b38335fbe62"), "uname" : "a6" }
-
修改(update)
-
修改器
修改器 作用 $inc 递增 $rename 重命名,修改字段 $set 修改列(字段)的值 $unset 删除列(字段) -
语法
db.集合名.update(条件,{修改器:{新数据}})
-
练习
// 将年龄为3数据的年龄 +3 (也可为负数,意为减)
> db.test3.update({age:3},{$inc:{age:3}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test3.find()
{ "_id" : ObjectId("605a88ea18656b38335fbe5d"), "uname" : "a1", "age" : 1 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5e"), "uname" : "a2", "age" : 2 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a13", "age" : 6 }
{ "_id" : ObjectId("605a88ea18656b38335fbe60"), "uname" : "a4", "age" : 4 }
// 将名称为 a3 数据的名称改为 a13
> db.test3.update({uname:"a3"},{$set:{uname:"a13"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test3.find()
{ "_id" : ObjectId("605a88ea18656b38335fbe5d"), "uname" : "a1", "age" : 1 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5e"), "uname" : "a2", "age" : 2 }
{ "_id" : ObjectId("605a88ea18656b38335fbe5f"), "uname" : "a13", "age" : 3 }
{ "_id" : ObjectId("605a88ea18656b38335fbe60"), "uname" : "a4", "age" : 4 }
// 综合写法
> db.test3.find({name:"Jarry"})
{ "_id" : ObjectId("605b059f5ebecf5896dfdd9b"), "name" : "Jarry", "age" : 19, "hobbies" : "play games", "who" : "sex" }
// 当连起来写时注意:(删除时写入字段名,值为true)
> db.test3.update({name:"Jarry"},{
... $set:{name:"John"},
... $rename:{who:"sexName"},
... $inc:{age:4},
... $unset:{hobbies:true}
... })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test3.find({name:"John"})
{ "_id" : ObjectId("605b059f5ebecf5896dfdd9b"), "name" : "John", "age" : 23, "sexName" : "sex" }
-
语法:
db.集合名.update(条件,新数据[是否新增,是否修改多条])
- 是否新增:指条件匹配不到数据则插入(true 是插入,false 不插入默认)
- 是否修改多条:指将匹配成功的数据都修改( true 是,false 否默认)
db.test2.find() { "_id" : ObjectId("605a836418656b38335fbe5c"), "name" : "Zip", "age" : 34 } db.test2.update({name:"John"},{$set:{name:"Jarry"}},true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("605b0ed01a182990c745cf7a") }) db.test2.find() { "_id" : ObjectId("605a836418656b38335fbe5c"), "name" : "Zip", "age" : 34 } { "_id" : ObjectId("605b0ed01a182990c745cf7a"), "name" : "Jarry" }
- 是否新增:指条件匹配不到数据则插入(true 是插入,false 不插入默认)
删除
-
语法:
db.集合名.remove(条件,[是否删除一条])
- [是否删除一条]:true 或 false
> db.test3.remove({},true) WriteResult({ "nRemoved" : 1 }) > db.test3.remove({}) WriteResult({ "nRemoved" : 10 }) > db.test3.find() >
总结(增、删、改、查)
-
增 Create
db.集合名.insert(JSON数据)
-
删 Delete
db.集合名.remove(条件,[是否删除一条])
-
改 update
db.集合名.update(条件,{修改器:{字段名:值}})
-
查 Read
db.集合名.find(条件,[查询的字段])
排序
- 语法:`db.集合名.find().sort({字段名:1 或 -1})
- 【1】 升序;【-1】降序
> db.test3.find().sort({age:-1})
{ "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }
{ "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
{ "_id" : ObjectId("605bdca20991976d007ead72"), "name" : "Jarry", "age" : 7 }
{ "_id" : ObjectId("605bdca20991976d007ead71"), "name" : "Jarry", "age" : 6 }
> db.test3.find().sort({age:1}))
{ "_id" : ObjectId("605bdca20991976d007ead71"), "name" : "Jarry", "age" : 6 }
{ "_id" : ObjectId("605bdca20991976d007ead72"), "name" : "Jarry", "age" : 7 }
{ "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
{ "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }
Limit 与 Skip方法
- 语法:
db.集合名.find().sort().skip(数字).limit(数字)
- skip 跳过指定数量(可选),limit限制查询的数量
- 练习:1.降序查询两条数据;2.降序跳过2跳并查询2条
> db.test3.find().sort({age:-1})
{ "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }
{ "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
{ "_id" : ObjectId("605bdf360991976d007ead77"), "name" : "Jarry", "age" : 5 }
{ "_id" : ObjectId("605bdf1b0991976d007ead76"), "name" : "Jarry", "age" : 4 }
{ "_id" : ObjectId("605bdf1b0991976d007ead75"), "name" : "Jarry", "age" : 3 }
> db.test3.find().sort({age:-1}).limit(2)
{ "_id" : ObjectId("605bdca20991976d007ead74"), "name" : "Jarry", "age" : 9 }
{ "_id" : ObjectId("605bdca20991976d007ead73"), "name" : "Jarry", "age" : 8 }
> db.test3.find().sort({age:-1}).skip(2).limit(2)
{ "_id" : ObjectId("605bdf360991976d007ead77"), "name" : "Jarry", "age" : 5 }
{ "_id" : ObjectId("605bdf1b0991976d007ead76"), "name" : "Jarry", "age" : 4 }
分页(基础案例)
- 需求:数据库 1-10 条数据,每页显示两条(5页)
- 语法: `db.集合名.find().skip().limit(2)
skip计算公式:(当前页 - 1) * 每页显示条数
聚合查询
-
语法:
db.集合名.aggregate([{管道:{表达式}])
-
常用管道
$group 将集合中的文档分组,用于统计结果 $match 过滤数据,只要输出符合条件的文档 $sort 聚合数据进一步排序 $skip 跳过指定文档数 $limit 限制集合数据返回文档数 -
常用表达式
$sum 总和 $avg 平均 $min 最小值 $max 最大值 $sum:1 统计其个数 … -
案例练习
-
准备数据
> db.cl.insert({_id:1,name:"a",sex:1,age:1}) > db.cl.insert({_id:2,name:"a",sex:1,age:2}) > db.cl.insert({_id:3,name:"b",sex:2,age:3}) > db.cl.insert({_id:4,name:"c",sex:2,age:4}) > db.cl.insert({_id:5,name:"d",sex:2,age:5}) > db.cl.find() { "_id" : 1, "name" : "a", "sex" : 1, "age" : 1 } { "_id" : 2, "name" : "a", "sex" : 1, "age" : 2 } { "_id" : 3, "name" : "b", "sex" : 2, "age" : 3 } { "_id" : 4, "name" : "c", "sex" : 2, "age" : 4 } { "_id" : 5, "name" : "d", "sex" : 2, "age" : 5 }
- 统计男生、女生的总年龄
> > db.cl.aggregate([
{
$group:{
_id:"$sex",
result:{$sum:"$age"}
}
}
])
{ "_id" : 2, "result" : 12 }
{ "_id" : 1, "result" : 3 }
- 统计男生、女生的总人数(个数)(count)
> > db.cl.aggregate([
{
$group:{_id:"$sex",result:{$sum:1}}
}
])
{ "_id" : 2, "result" : 3 }
{ "_id" : 1, "result" : 2 }
- 求学生总数和平均年龄
> > db.cl.aggregate([
{
$group:{_id:null,total_num:{$sum:1},total_avg:{$avg:"$age"}}
}
])
{ "_id" : null, "total_num" : 5, "total_avg" : 3 }
- 查询男生、女生人数,按人数升序
> > db.cl.aggregate([
{$group:{_id:"$sex",total_num:{$sum:1}}},
{$sort:{total_num:1}}
])
{ "_id" : 1, "total_num" : 2 }
{ "_id" : 2, "total_num" : 3 }
索引
创建索引
- 创建索引语法:
db.集合名.createIndex(待创建索引的列[额外选项])
- 参数:
- 待创建索引的列:{键:1,…键…,键:-1}
- 1 为升序;-1 为降序,例如{age:1}表示age 索引并按照升序的方式存储
- 额外选项 :设置索引的名称或者唯一索引等
删除索引
- 全部删除:
db.集合名.dropIndexes()
- 删除指定:
db.集合名.dropIndex(索引名)
查看索引
- 语法:`db.集合名.getIndexes()
练习
准备
for(var i=0;i<100000;i++){db.test3.insert({"name":"aaa"+i,"age":i})}
WriteResult({ "nInserted" : 1 })
- 给 name 添加普通索引,
db.test3.createIndex({name:1})
- 删除 name 索引,
- 命令:
db.集合名.dropIndex()
> db.test3.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"name" : 1
},
"name" : "name_1"
}
]
> db.test3.dropIndex("name_1"})
SyntaxError: missing ) after argument list :
@(shell):1:27
> db.test3.dropIndexes("name_1")
{ "nIndexesWas" : 2, "ok" : 1 }
> db.test3.getIndexes()
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
3.给 name 创建索引并起名 webopenfather
- 命令:
db.test3.createIndex({name:1},{name:"webopenfather"})
> db.test3.createIndex({name:1},{name:"webopenfather"})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.test3.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"name" : 1
},
"name" : "webopenfather"
}
]
- 创建复合/组合索引
- 需求:给name和age 添加组合索引
- 说明:一次性给两个字段建立索引
- 语法:
db.集合名createIndex({键1:方式,键1:方式})
> db.test3.createIndex({name:1,age:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
> db.test3.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"name" : 1
},
"name" : "webopenfather"
},
{
"v" : 2,
"key" : {
"name" : 1,
"age" : 1
},
"name" : "name_1_age_1"
}
]
- 设置唯一索引
- 命令:
db.test3.createIndex({name:1},{unique:"name"})
- 测试唯一索引特性
-
命令:
db.test3.insert({name:"a"})
-
命令:
db.test3.insert({name:"a"})
分析索引(explain)
-
语法:
db.集合名.find().explain('executionStats')
-
说明
-
索引扫描方式:COLLSCAN: 全盘扫描;IXSCAN :索引扫描; FETCH : 根据索引取检索指定 document
-
练习
- 测试 age 未添加索引情况
- 语法:
db.test3.find({age:18}).explain('executionStats')