mongodb 基本常用操作
服务启动
服务启动
mongod --config /usr/local/etc/mongod.conf
客户端启动
mongo
客户端退出
exit control+C
数据库相关操作
查看当前的数据库:db
查看所有的数据库:show dbs /show databases
切换数据库:use db_name (如果没有就创建该数据库)
删除当前的数据库:db.dropDatabase()
集合相关操作
不手动创建集合:
向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来
手动创建结合:
db.createCollection(name,options)
db.createCollection(“stu”)
db.createCollection(“sub”, { capped : true, size : 10 } )
参数capped: 默认值为false表示不设置上限,值为true表示设置上限
参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节
查看集合:show collections
删除集合:db.集合名称.drop()
monog相关数据类型
Object ID: ⽂档ID
String: 字符串, 最常⽤, 必须是有效的UTF-8
Boolean: 存储⼀个布尔值, true或false
Integer: 整数可以是32位或64位, 这取决于服务器
Double: 存储浮点值
Arrays: 数组或列表, 多个值存储到⼀个键
Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
Null: 存储Null值
Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数
Date: 存储当前⽇期或时间的UNIX时间格式
简单的增删改查
增
db.集合名称.insert(document)
db.stu.insert({name:‘gj’,gender:1})
db.stu.insert({_id:“20170101”,name:‘gj’,gender:1})
插⼊⽂档时, 如果不指定_id参数, MongoDB会为⽂档分配⼀个唯⼀的ObjectId
db.collection.insert({}) 插入数据,_id存在会报错
db.collectuion.save({}) 插入数据,_id存在会更新
改
db.集合名称.update( ,,{multi: })
参数query:查询条件
参数update:更新操作符
参数multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新
db.stu.update({name:‘hr’},{name:‘mnc’}) 把name 为hr的整条数据替换为mnc,hr原有的其他键值对也会没有
db.stu.update({name:‘hr’},{$set:{name:‘hys’}}) 把name 为hr的数据中name的值更新为为hys,更新一条,这个才是常用的操作
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
注意:“multi update only works with $ operators”
删
db.集合名称.remove(,{justOne: })
参数query:可选,删除的⽂档的条件
参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条
db.tv.remove({name:"xiaoming"},{justOne:true})
查
db.集合名称.find()
高级查询
条件查询
db.集合名称.find({条件⽂档})
查询年龄为10 的: db.stu.find({age:10})
查询年龄为10 ,只返回一条数据 db.stu.findone({age:10})
查年龄为10的数据,格式化输出 :db.stu.find({age:10}).pretty()
比较运算符
等于: 默认是等于判断, 没有运算符
⼩于:
l
t
(
l
e
s
s
t
h
a
n
)
⼩
于
等
于
:
lt (less than) ⼩于等于:
lt(lessthan)⼩于等于:lte (less than equal)
⼤于:
g
t
(
g
r
e
a
t
e
r
t
h
a
n
)
⼤
于
等
于
:
gt (greater than) ⼤于等于:
gt(greaterthan)⼤于等于:gte
不等于:KaTeX parse error: Expected '}', got 'EOF' at end of input: …stu.find({age:{gte:18}})
逻辑运算符
and:在json中写多个条件即可
or:使⽤$or, 值为数组, 数组中每个元素为json
and -->查询年龄⼤于或等于18,且性别为true的学⽣
db.stu.find({age:{$gte:18},gender:true})
or -->查询年龄⼤于18,或家乡在leshan的学⽣
db.stu.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gt:18}},{hometown:“leshan”}]})
查询年龄⼤于18或性别为男⽣, 并且姓名是小明
db.stu.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gte:18}},{gender:true}],name:‘xiaoming’})
范围运算符
使⽤"
i
n
"
,
"
in", "
in","nin" 判断是否在某个范围内
查询年龄为18、 28的学⽣
db.stu.find({age:{$in:[18,28]}})
正则表达式使用
使⽤//或$regex编写正则表达式
查询姓⻩开头的学⽣
db.stu.find({name:/^⻩/})
db.stu.find({name:{$regex:’^⻩’}})
limit 和skip使用
⽅法limit(): ⽤于读取指定数量的⽂档
db.集合名称.find().limit(NUMBER)
查询2条学⽣信息
db.stu.find().limit(2)
⽅法skip(): ⽤于跳过指定数量的⽂档
db.集合名称.find().skip(NUMBER)
db.stu.find().skip(2)
同时使用 类似于翻页操作
db.stu.find().limit(4).skip(5)或 db.stu.find().skip(5).limit(4)
注:建议先skip 再使用limit
投影—>选择返回结果的字段
在查询到的返回结果中, 只选择必要的字段
db.集合名称.find({},{字段名称:1,…})
参数为字段与值, 值为1表示显示, 不写不显示
特殊: 对于_id列默认是显示的, 如果不显示需要明确设置为0
db.stu.find({},{_id:0,name:1,gender:1})
sort 和count
⽅法sort(), ⽤于对 集进⾏排序
db.集合名称.find().sort({字段:1,…})
#参数 1 ---->升序排列
#参数 -1-----> 降序排列
根据性别降序, 再根据年龄升序
db.stu.find().sort({gender:-1,age:1}
⽅法count()⽤于统计结果集中⽂档条数
db.集合名称.find({条件}).count()
db.集合名称.count({条件})
db.stu.find({gender:true}).count()
统计stu集合里,年龄大于20的,gender 为true 的个数
db.stu.count({age:{$gt:20},gender:true})
去重distinct()
方法distinct()对数据进⾏去重 ----> 返回一个数组
db.集合名称.distinct(‘去重字段’,{条件})
stu集合中年龄大于18 的 人hometown来自哪里
db.stu.distinct(‘hometown’,{age:{$gt:18}})
备份和还原
备份的语法:
mongodump -h dbhost -d dbname -o dbdirectory
-h: 服务器地址, 也可以指定端⼝号
-d: 需要备份的数据库名称
-o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据
恢复语法:
mongorestore -h dbhost -d dbname --dir dbdirectory
-h: 服务器地址
-d: 需要恢复的数据库实例
–dir: 备份数据所在位置
备份
mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
还原
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
聚合 aggregate
聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})
管道
在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
常用管道如下:
$group: 将集合中的⽂档分组, 可⽤于统计结果
$match: 过滤数据, 只输出符合条件的⽂档
$project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort: 将输⼊⽂档排序后输出
$limit: 限制聚合管道返回的⽂档数
$skip: 跳过指定数量的⽂档, 并返回余下的⽂档
$unwind: 将数组类型的字段进⾏拆分
表达式
处理输入文档并输出
语法
表达式:’$列名’
常用表达式
s
u
m
:
计
算
总
和
,
sum:计算总和,
sum:计算总和,sum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据
g
r
o
u
p
将
集
合
中
的
文
档
分
组
,
可
用
于
统
计
结
果
i
d
表
示
分
组
的
依
据
,
使
用
某
个
字
段
的
格
式
为
′
group 将集合中的文档分组,可用于统计结果 _id表示分组的依据,使用某个字段的格式为'
group将集合中的文档分组,可用于统计结果id表示分组的依据,使用某个字段的格式为′字段’
group 注意点:
分组依据需要放在’_id’后面
取不同的字段的值需要使用 $ ‘
a
g
e
′
,
′
age','
age′,′gender’
取字典嵌套的字典中的值时。
i
d
.
c
o
u
n
t
r
y
能
够
按
照
多
个
键
进
行
分
组
{
_id.country 能够按照多个键进行分组 {
id.country能够按照多个键进行分组{group:{_id:{country:“
c
o
u
n
t
r
y
"
,
p
r
o
v
i
n
c
e
:
"
country",province:"
country",province:"province”}}}
例1:统计男生、女生的总人数
db.stu.aggregate([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: … _id:'gender’,
counter:{KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲ } …group:
{
_id:null,
counter:{KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲, a…avg:’$age’}
}
}
])
透视数据
例3:统计学生性别及学生姓名
db.stu.aggregate([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: … _id:'gender’,
name:{
p
u
s
h
:
′
push:'
push:′name’}
}
}
])
KaTeX parse error: Expected '}', got 'EOF' at end of input: …gregate([ {match:{age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:20}̲}} ]) 例2:查询年龄大于…match:{age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:20}̲}}, {group:{_id:‘KaTeX parse error: Expected '}', got 'EOF' at end of input: …nder',counter:{sum:1}}}
])
KaTeX parse error: Expected '}', got 'EOF' at end of input: …gregate([ {project:{_id:0,name:1,age:1}}
])
例2:查询男生、女生人数,输出人数
db.stu.aggregate([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:'gender’,counter:{KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲}}, {project:{_id:0,counter:1}}
])
KaTeX parse error: Expected '}', got 'EOF' at end of input: …tu.aggregate([{sort:{age:1}}])
例2:查询男生、女生人数,按人数降序
db.stu.aggregate([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:'gender’,counter:{KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲}}, {sort:{counter:-1}}
])
KaTeX parse error: Expected '}', got 'EOF' at end of input: …tu.aggregate([{limit:2}])
KaTeX parse error: Expected '}', got 'EOF' at end of input: …tu.aggregate([{skip:2}])
例3:统计男生、女生人数,按人数升序,取第二条数据
db.stu.aggregate([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:'gender’,counter:{KaTeX parse error: Expected 'EOF', got '}' at position 6: sum:1}̲}}, {sort:{counter:1}},
{KaTeX parse error: Expected 'EOF', got '}' at position 7: skip:1}̲, {limit:1}
])
注意顺序:先写skip,再写limit
$unwind
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
语法1
对某字段值进行拆分
db.集合名称.aggregate([{
u
n
w
i
n
d
:
′
unwind:'
unwind:′字段名称’}])
构造数据
db.t2.insert({_id:1,item:‘t-shirt’,size:[‘S’,‘M’,‘L’]})
查询
db.t2.aggregate([{
u
n
w
i
n
d
:
′
unwind:'
unwind:′size’}])
语法2
对某字段值进行拆分
处理空数组、非数组、无字段、null情况
db.inventory.aggregate([{
KaTeX parse error: Expected '}', got 'EOF' at end of input: … path:'字段名称’,
preserveNullAndEmptyArrays:#防止数据丢失
}
}])
构造数据
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 }
])
使用语法1查询
db.t3.aggregate([{
u
n
w
i
n
d
:
′
unwind:'
unwind:′size’}])
查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了
问:如何能不丢弃呢?
答:使用语法2查询
db.t3.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: unwind:{path:'sizes’,preserveNullAndEmptyArrays:true}}])