MongoDB常用操作命令
MongoDB为非关系型数据库(NoSQL)
NoSQL 泛指的是非关系型的数据库。是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSQL相比关系数据库的主要优势:
低延迟的读写速度:应用快速地反应能极大地提升用户交互速度;
高性能和可扩展性:基于键值对,数据没有耦合性,容易进行分布式扩展;
非结构化和不可预知的数据:NoSQL的存储格式是Key-Value形式、文档形式、图片形式等等,而关系型数据库则只支持基础类型。
NoSQL 在近几年非常流行,分为四大类:
于构建关系图谱。 类似于图的结构存储数据,可以利用图结构相关算法,便于探索数据之间的联系。
NoSQL的缺点:
不支持SQL语句:不提供SQL支持,学习和使用成本较高;
提供的功能有限:无事务处理,完整的解决方案和报表等支持不好;
稳定性:产品的完善程度和稳定性,不能和几十年的历史的关系型数据库相提并论。
MongoDB的基本操作
1:数据库的基本操作
连接成功后,默认使用test数据库
查看当前数据库名称
db
查看所有数据库名称,列出所有在物理上存在的数据库
show dbs
切换数据库,如果数据库不存在也并不创建,直到插入数据或创建集合时数据库才被创建
use 数据库名称
删除当前指向的数据库,如果数据库不存在,则什么也不做
db.dropDatabase()
2:集合的基本操作
创建语法如下
name是要创建的集合的名称
options是一个文档,用于指定集合的配置,选项参数是可选的,所以只需要到指定的集合名称
可以不手动创建集合,向不存在的集合中第一次加入数据时,集合会被创建出来
db.createCollection(name, options)
创建集合stu
#例1:不限制集合大小
db.createCollection(“stu”)
#例2:限制集合大小
- 参数capped:默认值为false表示不设置上限,值为true表示设置上限
- 参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
语法 :
db.createCollection(“stu”, {capped : true, size : 6142800} )
{ “ok” : 1 }
查看当前数据库的集合
show collections
删除命令
db.stu.drop()
3:数据增删改查
3.1: 插入数据: db.集合名称.insert({document}) eg: db.stu.insert({"_id":7, “name”:“张无忌”, “hometown”: “玉皇顶”, “age”: 23, “gender”:true})
3.2:简单查询: db.集合名称.find() eg: db.stu.find()
3.3:更新
语法
db.集合名称.update(
,
,
{multi: }
)
参数query:查询条件,类似sql语句update中where部分
参数update:更新操作符,类似sql语句update中set部分
参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
例3:全文档更新
db.stu.update({name:‘hr’},{name:‘mnc’})
例4:指定属性更新,通过操作符KaTeX parse error: Expected '}', got 'EOF' at end of input: …e({name:'hr'},{set:{name:‘hys’}})
例5:修改多条匹配到的数据
db.stu.update({},{$set:{gender:0}},{multi:true})
3.4:保存
语法
db.集合名称.save(document)
如果文档的_id已经存在则修改,如果文档的_id不存在则添加
例6
db.stu.save({_id:‘20160102’,‘name’:‘yk’,gender:1})
例7
db.stu.save({_id:‘20160102’,‘name’:‘wyk’})
3.5: 删除
语法
db.集合名称.remove(
,
{
justOne:
}
)
参数query:可选,删除的文档的条件
参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
例8:只删除匹配到的第一条
db.stu.remove({gender:0},{justOne:true})
例9:全部删除
db.stu.remove({})
4: 数据查询
4.1: 查询符合条件的全部数据 db.集合名称.find({条件}) eg: db.stu.find({“age”:18})
4.2: 查询符合条件的一条数据 db.集合名称.findOne({条件}) eg: db.stu.findOne({“age”: 18})
4.3: 格式化输出 db.集合名称.find({条件}).pretty()
4.4: 比较运算符
等于,默认是等于判断,没有运算符
小于 $lt
小于或等于 $lte
大于 $gt
大于或等于 $gte
不等于 KaTeX parse error: Expected '}', got 'EOF' at end of input: …stu.find({age:{gte:18}})
4.5: 逻辑运算
查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
逻辑与:默认是逻辑与的关系
例3:查询年龄大于或等于18,并且性别为1的学生
db.stu.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 7: gte:18}̲,gender:true})
…or
例4:查询年龄大于18,或性别为0的学生
db.stu.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gt:18}},{gender:true}]})
and和or一起使用
例5:查询年龄大于18或性别为0的学生,并且学生的姓名为gj
db.stu.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{gte:18}},{gender:true}],name:‘郭靖’})
4.6:范围运算
使用nin 判断是否在某个范围内
例6:查询年龄为18、28的学生
db.stu.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 11: in:[18,28]}̲})
4.7: 支持正则匹配…regex编写正则表达式
例7:查询姓黄的学生
db.stu.find({name:/^黄/})
db.stu.find({name:{KaTeX parse error: Double superscript at position 10: regex:'^黄'̲}}})
4.8: 自定义查…where后面写一个函数,返回满足条件的数据
例7:查询年龄大于30的学生
db.stu.find({KaTeX parse error: Expected 'EOF', got '}' at position 39: …rn this.age>20}}̲)
4.9: limit()…gte:18}}).limit(2)
方法skip():用于跳过指定数量的文档
db.集合名称.find({条件}).skip(条数) eg: db.stu.find({“age”:{KaTeX parse error: Expected 'EOF', got '}' at position 7: gte:18}̲}).skip(2)
…gte:18}}).skip(2).limit(2)
4.10:投影
在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段
如:一个文档有5个字段,需要显示只有3个,投影其中3个字段即可
语法:参数为字段与值,值为1表示显示,值为0不显示
db.集合名称.find({},{字段名称:1,…})
对于需要显示的字段,设置为1即可,不设置即为不显示
特殊:对于_id列默认是显示的,如果不显示需要明确设置为0
例1
db.stu.find({},{name:1, gender:true})
例2
db.stu.find({},{_id:0,name:1, gender:true})
4.11:排序
方法sort(),用于对结果集进行排序
语法
db.集合名称.find().sort({字段:1,…})
参数1为升序排列
参数-1为降序排列
例1:根据性别降序,再根据年龄升序
db.stu.find().sort({gender:-1,age:1})
4.12:统计个数
方法count()用于统计结果集中文档条数
语法
db.集合名称.find({条件}).count()
也可以与为
db.集合名称.count({条件})
例1:统计男生人数
db.stu.find({gender:1}).count()
例2:统计年龄大于20的男性人数
db.stu.count({age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:20}̲,gender:true})
…gt:18}})
5: 聚合
聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
语法
db.集合名称.aggregate([ {管道 : {表达式}} ])
管道
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入 ps aux | grep mongod
在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理
常用管道
$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档
列名’
常用表达式
sum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
KaTeX parse error: Expected '}', got 'EOF' at end of input: …tu.aggregate([{group: {_id : "KaTeX parse error: Expected '}', got 'EOF' at end of input: age", _sum : {sum : 1}}}])
{ “_id” : 45, “_sum” : 1 }
{ “_id” : 16, “_sum” : 1 }
{ “_id” : 40, “_sum” : 1 }
{ “_id” : 18, “_sum” : 2 }
{ “_id” : 20, “_sum” : 1 }
5.1: 字段’
例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}̲,
…avg:‘KaTeX parse error: Expected 'EOF', got '}' at position 5: age'}̲
}
…group:
{
_id:‘KaTeX parse error: Expected '}', got 'EOF' at end of input: … name:{push:‘KaTeX parse error: Expected 'EOF', got '}' at position 6: name'}̲
}
…KaTeX parse error: Expected '}', got 'EOF' at end of input: …egate([
{group:
{
_id:‘KaTeX parse error: Expected '}', got 'EOF' at end of input: … name:{push:’$KaTeX parse error: Expected 'EOF', got '}' at position 6: ROOT'}̲
}
…match
用于过滤数据,只输出符合条件的文档
使用MongoDB的标准查询操作
例1:查询年龄大于20的学生
db.stu.aggregate([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: match:{age:{gt:20}}}
])
例2:查询年龄大于20的男生、女生人数
db.stu.aggregate([
{KaTeX parse error: Expected '}', got 'EOF' at end of input: match:{age:{gt:20}}},
{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:'gender’,counter:{$sum:1}}}
])
5.3: KaTeX parse error: Expected '}', got 'EOF' at end of input: …regate([
{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}}
])
5.4: 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}}
])
5.5: skip
限制聚合管道返回的文档数
例1:查询2条学生信息
db.stu.aggregate([{KaTeX parse error: Expected 'EOF', got '}' at position 8: limit:2}̲])
跳过指定数量的文档,并…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
5.6: KaTeX parse error: Expected '}', got 'EOF' at end of input: …名称.aggregate([{unwind:‘KaTeX parse error: Expected 'EOF', got '}' at position 6: 字段名称'}̲])
构造数据
db.t2…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([{size’}])
查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了
问:如何能不丢弃呢?
答:使用语法2查询
db.t3.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: unwind:{path:'sizes’,preserveNullAndEmptyArrays:true}}])