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
# 端口号,默认为27017
port=27017

# 数据库存放路径 换成你自己的目录
dbpath=E:\Learn\Software\MongoDB\data

# 日志存放路径 换成你自己的目录
logpath=E:\Learn\Software\MongoDB\data\mongodb.log

# 是否追加日志
logappend=true

# 是否启用日志,默认启用
journal=true

# 是否过滤无用日志信息
quiet=true

4、配置MongoDBbin目录到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、查看当前所在数据库
1
db
4、查询数据库中所有集合
1
show collections
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