MongoDB简介
MongoDB
是为快速开发互联网Web应用而设计的数据库系统
MongoDB
的设计目标是极简、灵活,作为Web应用栈的一部分
MongoDB
的数据模型是面向文档的,所谓文档是一种类似于JSON
的结构
简单理解MongoDB
这个数据库中存的是各种各样的BSON(二进制JSON)
三个概念
- 数据库(
database
):数据库是一个仓库,在仓库中可以存放集合
- 集合(
collection
):集合类似于数组,在集合中可以存放文档
- 文档(
document
):文档数据库中的最小单位,我们可以存储和操作的内容都是文档
下载与安装
下载地址:https://www.mongodb.com/try/download/community
1、打开首页,我们可以在右侧下载当前最新版本的MongoDB
,选择自己需要的操作系统以及安装包的类型,个人有软件洁癖,所以这里选择了免安装版使用
2、下载完zip版本解压后,放到自定义目录下,红框内无用文件可删除,如图所示:
3、新建data
目录用于存放数据,新建配置文件mongodb.conf
,如图示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| port=27017
dbpath=E:\Learn\Software\MongoDB\data
logpath=E:\Learn\Software\MongoDB\data\mongodb.log
logappend=true
journal=true
quiet=true
|
4、配置MongoDB
的bin
目录到path
环境变量内,以后可在任意目录使用mongo
命令
1
| E:\Learn\Software\MongoDB\bin
|
5、管理员运行CMD,启动mongodb
,同时将MongoDB
注册为Windows服务
,没有任何提示说明服务注册成功
1
| mongod --config "E:\Learn\Software\MongoDB\mongodb.conf" --install --serviceName "MongoDB"
|
6、此时可以通过win + r
输入services.msc
打开服务列表,生成的MongoDB
服务,可以设置为开机自启,之后不用每次都手动启动MongoDB
7、启动服务后,我们可以直接在CMD中输入mongo
登录了,如图所示:
基本操作
数据库(database
) => 集合(collection
) => 文档(document
)
在MongoDB
中,数据库
和集合
都不需要手动创建
当我们创建文档
时,如果文档
所在的集合
或数据库
不存在,则会自动创建
查询相关
1、显示所有数据库
1
| show dbs 或者 show databases
|
2、使用某数据库
1 2 3 4 5
| # 注意 VSCode中 可能需要使用use("数据库名") use 数据库名
例如:进入hello数据库 use hello
|
3、查看当前所在数据库
4、查询数据库中所有集合
5、查看某集合中的所有文档
1 2 3 4 5
| # 如果是find() 省略查询对象即查询全部 db.集合名.find({}) 或 db.集合名.find()
例如:查询student集合中所有的文档 db.student.find()
|
6、根据条件查询某集合中的文档
1 2 3 4
| db.集合名.find({查询条件对象})
例如:查询student集合中name为Levi、age为20的文档 db.student.find({name:"Levi",age:20})
|
7、根据条件查询某集合中的第一个文档
1 2 3 4
| db.集合名.findOne({查询条件对象})
例如:查询student集合中age为20的第一个文档 db.student.findOne({age:20})
|
8、根据条件查询某集合中的第一个文档的某个属性值
1 2 3 4 5
| # 因为find方法返回的是数组 而findOne返回的是对象 所以find不适用该方法 可加[索引值]使用 db.集合名.findOne({查询条件对象}).属性名
例如:查询student集合中age为20的第一个文档的name属性值 db.student.findOne({age:20}).name
|
9、查询结果的数量
1 2 3 4
| db.集合名.find().count() 或 db.集合名.find().length()
例如:查询student集合中的文档数量 db.student.find().count()
|
10、查询内嵌文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 属性名必须加引号 单引号双引号均可 db.集合名.find({"属性名1.属性名2":"属性名2值"})
例如:现有集合person如下 { "_id": "5ffaba06c157ae635cc1238d", "name": "tangseng", "student": { "fname": "sunwukong", "age": 12 } } 要求查询出学生有sunwukong的记录 db.person.find({"student.fname":"sunwukong"})
|
11、查询操作符
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 查询操作符大于 db.集合名.find({属性名:{$gt:数字}})
# 查询操作符大于等于 db.集合名.find({属性名:{$gte:数字}})
# 查询操作符小于 db.集合名.find({属性名:{$lt:数字}})
# 查询操作符小于等于 db.集合名.find({属性名:{$lte:数字}})
# 查询操作符不等于 db.集合名.find({属性名:{$ne:数字}})
|
12、查询前N条数据
1 2 3 4
| db.集合名.find().limit(n)
例如:查询student集合前10条数据 db.student.find().limit(10)
|
13、跳过前N条数据
1 2 3 4
| db.集合名.find().skip(n)
例如:查询student集合第11条开始的数据 db.student.find().skip(10)
|
14、分页查询
1 2 3 4
| db.集合名.find().skip((pageNum-1)*pageSize).limit(pageSize)
例如:分页查询 pageSize为10 查询pageNum为2的文档记录 db.student.find().skip(10).limit(10)
|
15、排序查询
1 2 3 4 5 6 7
| # 正序排序 db.集合名.find().sort({属性名:1}) # 倒序排序 db.集合名.find().sort({属性名:-1})
例如:根据年龄倒序排序 db.student.find().sort({age:-1})
|
16、查询显示指定列
1 2 3 4 5
| # 查询显示指定列 1表示显示 0表示不显示 默认id显示 可手动关闭 db.集合名.find({},{属性名1:1,属性名2:0})
例如:查询student集合的名字和年龄 不显示id db.student.find({},{name:1,age:1,_id:0})
|
新增相关
1、向集合中插入一条数据
1 2 3 4
| db.集合名.insertOne({插入对象}) 等同于 insert
例如:向student集合中插入一条数据 db.student.insertOne({name:"Levi",age:19})
|
2、向集合中插入多条数据
1 2 3 4
| db.集合名.insertMany([插入对象数组]) 等同于 insert
例如:向student集合中插入多条数据 db.student.insertMany([{name:"Jack",age:18},{name:"Lily",age:19}])
|
3、向集合中循环插入多条数据
1 2 3 4 5 6
| # 向numbers集合中循环插入20000条数据 var arr = []; for(var i=1; i<=20000; i++){ arr.push({num:i}); } db.numbers.insert(arr);
|
修改相关
1、根据条件修改符合的第一个文档(丢失原有属性)
1 2 3 4 5
| # 将对象全部修改为第二个对象 会丢失原有属性 db.集合名.updateOne({查询条件对象},{要修改成的新对象}) 等同于 update 等同于 replaceOne
例如:修改student集合中name为Levi的文档 age为11 db.student.updateOne({name:"Levi"},{age:11})
|
2、根据条件修改符合的第一个文档(增加属性)
1 2 3 4 5
| # 仅增加第二个对象的属性 不丢失原有属性 db.集合名.updateOne({查询条件对象},{$set:{要增加的属性名}}) 等同于 update
例如:修改student集合中name为Levi的文档 增加属性age为11 db.student.updateOne({name:"Levi"},{$set:{age:11}})
|
3、根据条件修改符合的第一个文档(删除属性)
1 2 3 4 5
| # 仅删除第二个对象的属性 不丢失原有属性 db.集合名.updateOne({查询条件对象},{$set:{要删除的属性名}}) 等同于 update
例如:修改student集合中name为Levi的文档 删除属性age为11 db.student.updateOne({name:"Levi"},{$unset:{age:11}})
|
4、同时修改多条记录(新增或删除属性)
1 2 3 4 5
| db.集合名.updateMany({查询条件对象},{$set:{要增加的属性名}}) 或删除属性 $unset db.集合名.update({查询条件对象},{$set:{要增加的属性名},{multi:true}}) 或删除属性 $unset
例如:给student集合中age为19的文档 增加sex为man的属性 db.student.updateMany({age:19},{$set:{sex:"man"}})
|
5、向集合中某个数组属性新增一个文档
1 2 3 4
| # 向集合中添加一个新的元素 相当于List 可重复添加 db.集合名.update({查询条件对象},{$push:{要添加的元素}}) # 向集合中添加一个新的元素 相当于Set 无重复添加 db.集合名.update({查询条件对象},{$addToSet:{要添加的元素}})
|
6、在原有属性值的基础上自增
1
| db.集合名.update({查询条件对象},{$inc:{要自增的对象}})
|
删除相关
1、删除文档
1 2 3 4 5 6 7
| # 删除文档 remove默认情况下等同于deleteMany # remove添加第二个参数true则删除一个 空对象删除全部 db.集合名.remove({查询条件对象}) db.集合名.remove({查询条件对象},true) db.集合名.deleteOne({查询条件对象}) db.集合名.deleteMany({查询条件对象}) db.集合名.remove({空对象})
|
2、删除集合
1 2
| # 删除集合 如果数据库中没有集合 则会不显示数据库 db.集合名.drop()
|
3、删除数据库
1 2
| # 删除数据库 db.dropDatabase()
|
查询手册
https://www.lanzous.com/iLFUbk8xy0f