mongodb总结

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) ⼩于等于: ltlessthanlte (less than equal)
⼤于: g t ( g r e a t e r t h a n ) ⼤ 于 等 于 : gt (greater than) ⼤于等于: gtgreaterthangte
不等于: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:计算总和, sumsum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据

g r o u p 将 集 合 中 的 文 档 分 组 , 可 用 于 统 计 结 果 i d 表 示 分 组 的 依 据 , 使 用 某 个 字 段 的 格 式 为 ′ group 将集合中的文档分组,可用于统计结果 _id表示分组的依据,使用某个字段的格式为' groupid使字段’
group 注意点:
分组依据需要放在’_id’后面
取不同的字段的值需要使用 $ ‘ a g e ′ , ′ age',' age,gender’
取字典嵌套的字典中的值时。 i d . c o u n t r y 能 够 按 照 多 个 键 进 行 分 组 { _id.country 能够按照多个键进行分组 { id.countrygroup:{_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}}])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值