1、使用数据库
如果数据库不存在,则创建数据库,否则切换到指定数据库
use <dbname>
2、查看所有数据库
show dbs
3、查看当前所在数据库
db
4、删除数据库
删除当前所在的数据库
db.dropDatabase()
5、查看当前数据库中所有的集合
show collections
或
show tables
6、创建集合
创建集合有两种方式:
(1)显示创建
db.createCollection("person")
(2)隐式创建
db.person.insert({name:"jack",age:20})
7、删除集合
db.person.drop()
8、添加文档数据
db.person.insert({name:"jack",age:20})
9、更新文档数据
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
- criteria:用于设置查询条件的对象
- objNew:用于设置更新内容的对象
- upsert:如果记录已经存在,更新它,否则新增一个记录,取值为0或1
- multi:如果有多个符合条件的记录,是否全部更新,取值为0或1
注:默认情况下, 只会更新第一个符合条件的记录
(1)更新集合中的文档,$set用来指定一个键的值,如果这个键不存在,则创建
示例:
更新第一条
db.person.update({name:"jack"},{$set:{name:"Jack"}})
db.person.update({name:"jack"},{$set:{name:"Jack"}},false,false)
全部更新
db.person.update({name:"jack"},{$set:{name:"Jack"}},false,ture)
只添加一条
db.person.update({name:"jack"},{$set:{name:"Jack"}},true,flase)
全部添加加进去
db.person.update({name:"jack"},{$set:{name:"Jack"}},true,true)
(2)更新集合中的文档,使用$inc将集合中name为Jack的age加1,其他键不变,$inc表示使某个键值加减指定的数值
db.person.update({name:"Jack"},{$inc:{age:1}})
(3)更新集合中的文档,$unset用来删除某个键,例如删除name为Jack的文档中的address键
db.person.update({name:"Jack"},{$unset:{age:1}},0,1)
10、删除文档数据
db.person.remove({name:"Jack"})
不加条件为删除所有数据
11、聚合数据
聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
管道:mongodb常用管段如下:
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
表达式:mongodb常用表达式如下:
- $sum:计算总和,$sum:1同count表示计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据
11.1、$group --- 将集合中的文档分组,可用于统计结果
(1)将集合中的文档进行分组、统计
db.stu.aggregate([
{$group:
{
_id:'$gender',
counter:{$sum:1}
}
}
])
(2)统计学生的性别及学生的姓名
db.stu.aggregate([
{$group:
{
_id:'$gender',
name:{$push:'$name'}
}
}
])
(3)如果在分组后,想得到整个文档的内容,可以通过$push使用$$ROOT将文档内容加入到结果集的数组中
db.stu.aggregate([
{$group:
{
_id:'$gender',
name:{$push:'$$ROOT'}
}
}
])
11.2、$match --- 用于过滤数据,只输出符合条件的文档
查询年龄大于20的男生、女生人数
db.stu.aggregate([
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',counter:{$sum:1}}}
])
11.2、$project--- 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果,0表示不显示,1表示显示
db.stu.aggregate([
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',counter:{$sum:1}}},
{$project:{_id:0,counter:1}}
])
11.3、$sort --- 将输入文档排序后输出,1表示升序,-1表示降序
db.stu.aggregate([
{$group:{_id:'$gender',counter:{$sum:1}}},
{$sort:{counter:-1}}
])
11.4、$limit --- 限制聚合管道返回的文档数
db.stu.aggregate([{$limit:2}])
11.5、$skip --- 跳过指定数量的文档,并返回余下的文档
db.stu.aggregate([{$skip:2}])
11.6、$unwind --- 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
db.t3.aggregate([{$unwind:{path:'$size',preserveNullAndEmptyArrays:true}}])
注意:
preserveNullAndEmptyArrays:true的作用是为了防止丢弃数据,比如size字段的内容可能是空数组、无字段、null的文档,这样就不会将数据丢弃,初始数据如下:
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
12、查询文档数据
(1)根据条件查询
#name=Jack,所有列
db.person.find({name:"Jack"}).pretty()
#name=Jack,除了age的所有列
db.person.find({name:"Jack"},{age:0}).pretty()
#name=Jack,显示age列
db.person.find({name:"Jack"},{age:1}).pretty()
(2)使用条件表达式 --- >,>=,<,<=,!=
#age<20
db.person.find({age:{$lt:20}}).pretty()
#age<=20
db.person.find({age:{$lte:20}}).pretty()
#age>20
db.person.find({age:{$gt:20}}).pretty()
#age<=20
db.person.find({age:{$gte:20}}).pretty()
#age!=20
db.person.find({age:{$ne:20}}).pretty()
(3)使用条件表达式 --- and
db.person.find({name:"Jack",age:21}).pretty()
(4)使用条件表达式 --- $all
$all主要用来查询数据中的包含关系,查询条件中只要有一个不包含就不返回
db.person.insert({name:"Jack",post:[1,2,3,4,5,6,7,8,9]})
db.person.insert({name:"Jack1",post:[1,3,5,7,9]})
db.person.insert({name:"Jack2",post:[2,4,6,8]})
db.person.find({post:$all:[1,2]})
(5)使用条件表达式 --- $in
$in类似于关系型数据库中的in
db.person.find({post:{$in:[1,2,3]}})
(6)使用条件表达式 --- $nin
与$in相反
db.person.find({post:{$nin:[1,3]}})
(7)使用条件表达式 --- $or
$or相当于关系型数据库中的or,表示或者关系
db.person.find({$or:[{name:"Jack"},{age:20}]})
(8)使用条件表达式 --- $nor
与$or相反
db.person.find({$nor:[{name:"Jack"},{age:20}]})
(9)使用条件表达式 --- $exists
用于查询集合中存在某个键的文档或不存在某个键的文档
$exists:1表示真,指存在
$exists:0表示假,指不存在
db.person.find({age:{$exists:1}})
(10)使用条件表达式 --- $type
db.person.find({name:{$type:2}})
$type操作符
类型 | 数字 |
---|---|
Double | 1 |
String | 2 |
Object | 3 |
Array | 4 |
Binary data | 5 |
Boolean | 8 |
Object id | 7 |
Date | 9 |
Null | 10 |
(11)查询第一个
db.person.findOne()
(12)游标
#获取person中的所有数据
var result = db.person.find()
#游标查看是否有下一条
result.hasNext()
#获取下一条数据
result.next()
(13)统计 --- count()
db.person.find().count()
(14)排序 --- sort()
升序:1
降序:-1
db.person.find().sort({age:1});
(15)分页 --- skip(),limit()
skip():从哪个位置开始
limit():返回一定数量的结果
db.person.find().sort({age:-1}).skip(2).limit(3);
(16)统计查询执行时间 --- explain()
db.tablename.find().explain()