在工作室听闻老师要安排班上学生做 MongoDB 实训,身为工作室灌水王的我,整理了份 MongoDB 的学习入门资料,下面记录一下入门时经常使用到的mongoDB语句。
一、 关于 MongoDB
1.1 MongoDB 简介
- MongoDB 是开源文档数据库,是一个基于分布式文件存储的非关系型数据库。
- MongoDB的基本概念是文档(document)、集合(collection)、数据库(database),文档是核心单元,像 {c:1} ; {s:“abcde”} 等,多个文档组成一个集合(相当于关系数据库的表)。
- 文档的数据结构和JSON基本一样,以 JSON 格式的文档保存数据。
- 所有存储在集合中的数据都是BSON格式,采用BSON存储文档数据。(BSON是一种类json的一种二进制形式的存储格式)
1.2 SQL 与 MongoDB 术语/概念对比
SQL | MongoDB | 解释 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表 / 集合 |
row | document | 数据记录行 / 文档 |
column | Field | 数据字段 / 域 |
index | Index | 索引 |
table joins | 无 | 表连接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
二、 安装 MongoDB
2.1 安装时相关命令
命令 | 解释 |
---|---|
–bind_ip 0.0.0.0 | 本地ip |
–logpath +路径 | 日志路径 |
–logappend | 设置为追加日志 |
–dbpath +路径 | 数据库的路径 |
–port +端口 | 服务器的端口 |
–serviceName +名字 | 服务器的名字 |
–serviceDisplayname +名字 | 服务器的显示名字 |
–install | 安装 |
在浏览器输入localhost:27017 (MongoDB的端口号是27017),
查看是否连接成功。
2.2 启动、关闭 MongoDB
命令 | 解释 |
---|---|
net start MongoDB | 启动MongoDB服务 |
net stop MongoDB | 关闭MongoDB服务 |
也可以在任务管理器用鼠标操作 启动 、关闭 。
三、 使用 MongoDB
3.1 数据库的增删改查(CRUD)
创建数据库 (如果数据库名不存在,则创建;否则切换指定数据库)
use 数据库名
查看所有数据库
show dbs
查看当前数据库 (MongoDB默认的数据库为test,如果没有创建新的数据库,集合将存放在test数据库中)
db //刚创建的数据库并不在数据库列表中,要显示它,需要向该数据库中插入数据
删除数据库 (删除当前数据库)
db.dropDatabase()
3.2 集合的操作
创建集合
db.createCollection('name',options)
//例如:db.createCollection('student')
查询数据库中所有集合
show collections
对集合重命名
db.旧名.renameCollection('new name')
删除集合
db.集合名.drop()
3.2.1 固定集合
特点:
- 可以声明集合容量的大小。
- 插入数据时,新文档会被插到队列末尾,当队列被占满时,最老的文档会被覆盖。
- 适用于想要自动删除属性的地方(比如日志、记录等只需保留最近时间内的应用情景)。
- 写入速度快(不建立索引;写入磁盘上的固定空间,所以不会因为其他集合一些随机性的写入操作而中断)。
注意:
- 创建后不能更改,只能删除或重建。
- 固定集合不能转为普通集合。
- 不能进行分片,不能删除文档(可以删除整个集合)。
- 可以进行更新(update),但更新不能让文档的size发生变化。
创建固定集合
db.createCollection("name",{capped,size})
/*例如:创建固定集合AAA,大小限制为1024个字节,文档数量限制为100。
db.createCollection("AAA",{capped:true,size:1024,max:100})
*/
普通集合转固定集合 (没有限制文档数量的参数,即没有max的参数选项)
db.runCommand({"convertToCapped":"集合名","size":字节大小})
/*例如:将col集合转换为一个大小为1024字节的固定集合。
db.runCommand({"convertToCapped":"col","size":1024})
*/
判断是否为固定集合 (判断后显示true或者false)
db.集合.isCapped()
查看集合属性
db.集合.stats()
3.3 插入文档
使用 insert() 或 save() 向集合中插入文档(如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档)。
两者的区别:
- 当插入重复数据时:若新增数据的主键已经存在,insert会提示异常,不保存当前数据;save则会对当前已经存在的数据进行修改操作。
- 批操作时:insert可以一次性插入;而save需要一个个地插入。
插入单个文档
db.集合名.insert({需要插入的内容})
//例如:db.stuinfo.insert({_id:001,name:'alice',age:18})
插入单个文档(先定义再插入)
//定义一个值,再插入这个值
/*例如:s={_id:5,name:'张三',age:19}
db.stuinfo.insert(s)
*/
插入多个文档
db.集合名.insert([{内容},{内容}])
//例如:db.foo.insert([{_id:3,name:'yu',age:18},{_id:4,name:'en',age:19}])
// 不要漏掉中括号
插入多条数据
//让其自加,再插入
/*例如:for(var i=1;i<10;i++)
db.col.insert({count:i,test2:false,test5:true})
*/
3.4 更新文档
使用 update() 和 save() 方法来更新集合中的文档。
两者的区别:
update | save |
---|---|
用于更新已存在的文档 | 通过传入的文档来替换已有文档 |
update更新文档
db.集合.update({旧的},{$set:{新的}})
/*例如:db.stuinfo.update({name:'curry'},{$set:{name:'王五'}})
(以上语句只会修改第一条发现的文档)
如果要修改多条相同的文档,则需要设置 multi 参数为 true,如下:
db.stuinfo.update({name:'curry'},{$set:{name:'王五'}},{multi:true})
*/
save更新文档
db.集合名.save({内容})
//例如:db.stuinfo.save({_id:2,name:'curry',age:20})
3.5 删除文档
使用 remove(),deleteOne() 或 deleteMany() 方法移除集合中的数据。
删除全部文档 (可以在括号内加条件)
db.集合名.deleteMany({}) 或 db.集合名.remove({})
//例如:db.foo.deleteMany({'test5':true})
删除全部文档 (remove用法)
db.集合.remove(<query>,{justOne: <boolean>})
/* 参数query:可选,删除条件
参数justOne:可选,如果设为true或1,则只删除一条;默认为false
例如:只删除年龄为18的一条数据
db.foo.remove({'age':18},{justOne:1})
*/
删除一个文档
db.集合名.deleteOne({})
//例如:db.foo.deleteOne({age:18})
3.6 查询文档
查询文档 (可在括号内加查询条件)
db.集合名.find()
查询文档 (只查询第一条)
db.集合名.findOne()
查询文档 (格式化显示)
db.集合名.find().pretty()
多条件查询
// 在括号内加逗号分开条件
//例如:db.items.find({quantity:2,price:{$gte:4}})
3.6.1 文档查询条件的使用
符号 | 解释 |
---|---|
等于 | 无 |
小于 | $lt |
小于或等于 | $lte |
大于 | $gt |
大于或等于 | $gte |
不等于 | $ne |
等于
db.集合名.find({‘属性’:条件})
//例如:db.items.find({price:20})
小于 ($lt)
db.集合名.find({‘属性’:{$lt:条件}})
//例如:db.items.find({price:{$lt:5}})
小于或等于 ($lte)
db.集合.find({‘属性’:{$lte:条件}})
//例如:db.items.find({price:{$lte:5}})
大于 ($gt)
db.集合名.find({‘属性’:{$gt:条件}})
//例如:db.items.find({price:{$gt:5}})
大于或等于 ($gte)
db.集合.find({‘属性’:{$gte:条件}})
//例如:db.items.find({price:{$gte:10}})
不等于 ($ne)
db.集合.find({‘属性’:{$ne:条件}})
//例如:db.items.find({price:{$ne:20}})
3.6.2 范围查询
使用 $in 或者 $nin 判断
db.集合.find({属性:{$in:[条件]}})
/*例如:查询年龄为18、19、20的学生。
db.stuinfo.find({'age':{$in:[18,19,20]}})
*/
3.6.3 排序查询
sort的用法(参数1为升序,-1为降序)
db.集合.find().sort({属性:参数})
/*例如:按照年龄升序排序。
db.stuinfo.find().sort({age:1})
例如:按照年龄升序,主键降序排序。
db.stuinfo.find().sort({age:1,_id:-1})
*/
3.6.4 使用 limit 和 skip 查询
查询指定数量的文档
db.集合.find().limit(数量)
/*例如:查询2条信息。
db.stuinfo.find().limit(2)
*/
跳过指定数量的文档再查询
db.集合.find().skip(数量)
/*例如:跳过2条数据再查询
db.stuinfo.find().skip(2)
*/
以上可以同时使用
//例如:db.stu.find().skip(5).limit(4)
3.6.5 聚合查询
文档通过一个或多个阶段(stage)组成管道,对管道进行分组、过滤等功能。
db.集合名.aggregate()
符号 | 解释 |
---|---|
$sum | 总和 |
$avg | 平均值 |
$min | 最小值 |
$max | 最大值 |
db.集合.aggregate([{$group:{_id:’id的名称’,’属性名’:{$sum:"$要统计的内容"}}}])
// 不要在要统计的内容前漏掉 $
使用聚合aggregate:
/*例如:统计price的总和
db.foo.aggregate([{$group:{_id:null,’总数’:{$sum:"$price"}}}])
例如:通过产品类型分组,再统计卖出的数量
db.foo.aggregate([{$group:{_id:"$mold",total:{$sum:"$BBBB"}}}])
*/
3.6.6 使用 or 语句进行条件查询
使用or语句(别漏掉中括号)
db.集合名.find({$or:[{key1: value1}, {key2:value2}]})
/*例如:查询AAA为10或价格大于等于5。
db.foo.find({$or:[{AAA:10},{price:{$gte:5}}]})
*/
3.6.7 使用 and 和 or 联合查询
/*例如:查询AAA为“p003”且BBB为10或价格大于等于5的商品数据。
db.items.find({AAA:'p003',$or:[{BBB:10},{price:{$gte:5}}]})
*/
3.6.8 使用管道查询
/*例如:将相同的产品类型进行分组,统计各个产品数量,然后获取最大的数量。
db.items.aggregate([{$group:{_id:"$pnumber",total:{$sum:"$quantity"}}},{$group:{_id:null,max:{$max:"$total"}}}])
*/
3.7 统计集合中文档的数目
统计集合中文档的数目 (可以在括号内加条件)
db.集合名.count()
/*例如: db.foo.count()
db.foo.count({sex:'man'})
*/
3.8 消除重复
distinct的用法去重 (不要用大括号把去重字段也括进去)
db.集合.distinct(‘去重字段’,{条件})
//例如: db.stuinfo.distinct('王五',{age:{$gt:29}})
另外,推荐下载Navicat来管理数据库,使用Navicat操作数据库比较友好。
文章来源: https://blog.csdn.net/qq_45069279 ,作者:苜苜的烂笔头,版权归原作者所有,如需转载,请联系作者。
原文链接:https://blog.csdn.net/qq_45069279/article/details/105754873