零、本文纲要
一、MongoDB相关概念
- 应用场景
- 体系结构
- 数据模型
二、使用MongoDB
- 安装MongoDB
- 常用命令
① 数据库操作
② 集合操作(对应数据库表操作)
③ 文档操作(相当于数据库CRUD)
Ⅰ 插入数据
Ⅱ 查询操作
Ⅲ 更新操作
Ⅳ 删除操作
④ 文档操作(其他常用查询)
Ⅰ 统计操作
Ⅱ 分页操作
Ⅲ 排序操作
Ⅳ 模糊查询(正则查询)
Ⅴ 比较查询
Ⅵ 包含查询
Ⅶ 条件连接查询
⑤ 操作小结
一、MongoDB相关概念
1. 应用场景
① 数据量大;
② 写入操作频繁(读写都很频繁);
③ 价值较低的数据,对事务性要求不高;
2. 体系结构
SQL术语/概念 | MongoDB术语/概念 | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | / | 表连接,MongoDB不支持 |
/ | 嵌入文档 | MongoDB通过嵌入式文档来替代多表连接 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
3. 数据模型
MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。
数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。
Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object;
mongo还使用了特殊的数据类型,包括:date,object id,binary data,regular expression 和code。
常见数据类型
数据类型 | 描述 | 举例 |
---|---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 | {"x" : "foobar"} |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 | shell是不支持该类型的, shell中默认会转换成64位浮点数 |
Boolean | 布尔值。用于存储布尔值(真/假)。 | {"x":true}+ |
Double | 双精度浮点值。用于存储浮点值。 | {"x":3.14159,"y":3} |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 | |
Array | 用于将数组或列表或多个值存储为一个键。 | {"x" : ["a", "b", "c"]} |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 | |
Object | 用于内嵌文档。 | |
Null | 用于创建空值。 | {"x":null} |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 | |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 | |
Object ID | 对象 ID。用于创建文档的 ID。 | {"X" :ObjectId() } |
Binary Data | 二进制数据。用于存储二进制数据。 | |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 | {"x" : function() { /* …… */ }} |
Regular expression | 正则表达式类型。用于存储正则表达式。 | {"x" : /foobar/i} |
二、使用MongoDB
1. 安装MongoDB
下载MongoDB.png① 解压至指定目录
tar -zxvf mongodb-linux-x86_64-4.0.10.tgz -C /usr/local
② 准备数据目录
cd mongodb-linux-x86_64-4.0.10/
mkdir -p single/data/db
mkdir -p single/log
③ 编写配置文件
touch single/mongodb.conf
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
# #The path of the log file to which mongod or mongos should send all diagnostic logging information
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/mongodb-linux-x86_64-4.0.10/single/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
##The directory where the mongod instance stores its data.Default Value is "/data/db".
dbPath: "/usr/local/mongodb-linux-x86_64-4.0.10/single/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
net:
#服务实例绑定的IP,默认是localhost
bindIp: localhost,192.168.253.128
#bindIp
#绑定的端口,默认是27017
port: 27017
④ 启动MongoDB服务
bin/mongod -f single/mongodb.conf
查看进程启动情况:ps -ef | grep mongod
⑤ 关闭MongoDB服务
标准的关闭方法需要连接至其客户端进行关闭,如下:
bin/mongo --port 27017
use admin
db.shutdownServer()
如果遇到数据损坏:
rm -f single/data/db/*.lock
bin/mongod --repair --dbpath=single/data/db
2. 常用命令
MongoDB官方文档,这个网址不稳定,需要飞机。
首先登录其client端bin/mongo --port 27017
,此处也可以使用其他数据库客户端直接连接,如:DataGrip。
① 数据库操作
# 创建数据库
use [database_name]
#如:
use db_test
# 查看当前权限的所有数据库
show databases
show dbs
# 查看当前正在使用的数据库
db
# 删除数据库,删除当前数据库
db.dropDatabase()
② 集合操作(对应数据库表操作)
# 显示创建(了解)
db.createCollection(["collection_name"])
#如:
db.createCollection("collection_test")
#查看当前库中的集合(对应数据库的表)
show collections
show tables
# 删除集合
db.collection.drop()
db.[collection_name].drop()
#如:
db.collection_test.drop()
③ 文档操作(相当于数据库CRUD)
Ⅰ 插入数据
注意:此处插入的数据后续会持续用到,如果后续数据不足可以重新插入几个。
# 单个文档插入
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
#如:
db.collection_test.insertOne(
{
"articleid":"100000",
"content":"今天天气真好,阳光明媚",
"userid":"1001",
"nickname":"Rose",
"createdatetime":new Date(),
"likenum":NumberInt(10),
"state":null
}
)
# 批量插入
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
#如:
db.collection_test.insertMany([
{
"_id":"1",
"articleid":"100001",
"content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。",
"userid":"1002",
"nickname":"相忘于江湖",
"createdatetime":new Date("2019-08-05T22:08:15.522Z"),
"likenum":NumberInt(1000),
"state":"1"
},
{
"_id":"2",
"articleid":"100001",
"content":"我夏天空腹喝凉开水,冬天喝温开水",
"userid":"1005",
"nickname":"伊人憔悴",
"createdatetime":new Date("2019-08-05T23:58:51.485Z"),
"likenum":NumberInt(888),
"state":"1"
}
]);
参数说明:
document:要写入的文档;
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求;
ordered:指定是否按顺序写入,默认 true,按顺序写入。
一般我们都只写<document>,writeConcern 与 ordered 使用默认值即可。
Ⅱ 查询操作
# 查询所有
db.[collection_name].find()
db.[collection_name].find({})
#如:
db.collection_test.find();
# 条件查询
db.[collection_name].find(
{
[field_name]: [field_value]
}
)
#如:
db.collection_test.find({articleid: "100000"})
db.collection_test.find({articleid: "100001", likenum: 888})
# 投影查询:指定显示与不显示的字段
db.[collection_name].find(
{
[field_name]: [field_value]
},
{
[field_name]: 1, #显示
[field_name]: 0 #不显示
}
)
#如:
db.collection_test.find(
{articleid: "100001", likenum: 888},
{_id: 0, articleid: 1, likenum: 1}
)
查询全部.png
Ⅲ 更新操作
# 单个更新操作
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
#如:
db.collection_test.updateOne(
{articleid: "100000"},
{$set:{likenum:NumberInt(99)}}
)
# 批量更新
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
#如:
db.collection_test.updateMany(
{articleid: "100001"},
{$set:{likenum:NumberInt(99)}}
)
# 列值增长 $inc
db.collection_test.updateMany(
{_id: "2"},
{$inc:{likenum:NumberInt(1)}}
)
参数说明:
filter : update的查询条件,类似sql update查询内where后面的;
update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的;
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入;
writeConcern:可选,抛出异常的级别;
collation : 可选,指定 用于操作的排序规则;
arrayFilters :可选,筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素;
hint:可选,指定用于支持查询谓词的索引的文档或字符串,4.2.1版本开始可用。
一般我们也不通过语句直接使用这些参数。
Ⅳ 删除操作
# 删除单个
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
#如:
db.collection_test.deleteOne(
{likenum: NumberInt(100)}
)
# 删除多个
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
#如:
db.collection_test.deleteMany(
{likenum: NumberInt(99)}
)
# 删表跑路
db.collection_test.deleteMany({})
④ 文档操作(其他常用查询)
Ⅰ 统计操作
与4.0功能兼容的MongoDB驱动程序弃用各自的光标和收集count()的API,取而代之的是新的API countDocuments()和estimatedDocumentCount()。
此处,count()的功能我们会通过新的API实现。
# 统计操作(类似数据库聚合查询)
db.collection.countDocuments( <query>, <options> )
#如:
db.collection_test.countDocuments({}) #统计文档记录数
db.collection_test.countDocuments( #统计likenum为888的记录数
{likenum: NumberInt(888)}
)
# 不含过滤规则的统计
db.collection.estimatedDocumentCount( <options> )
#如:
db.collection_test.estimatedDocumentCount({})
options参数说明
limit 整数 可选 要计算的最大文件数。
skip 整数 可选 计数前要跳过的文档数。
hint 字符串或文件 可选 用于查询的索引名称或索引规范。
maxTimeMS 整数 可选的 允许计数运行的最长时间。
避免使用db.collection.count()
没有查询谓词的方法,因为如果没有查询谓词,该方法将基于集合的元数据返回结果,这可能会导致近似计数。
特别是:
a、在分片群集上,结果计数将无法正确过滤出孤立的文档;
b、不正常关机后,计数可能不正确。
Ⅱ 分页操作
# 分页查询
db.collection.find().limit(NUMBER).skip(NUMBER)
#如:
db.collection_test.find().limit(2).skip(2)
Ⅲ 排序操作
# 排序操作
db.collection.find().sort(
{
field_name: 1, #1表示升序
field_name: -1 #-1表示降序
}
)
#如:
db.collection_test.find().sort(
{
state: 1,
likenum: -1
}
)
Ⅳ 模糊查询(正则查询)
# 正则查询
db.collection.find({field_name:/正则表达式/})
#如:
db.collection_test.find(
{nickname: /江湖/}
)
Ⅴ 比较查询
# 比较查询
db.collection.find({ field_name : { $gt: value }}) // 大于: field > value
db.collection.find({ field_name : { $lt: value }}) // 小于: field < value
db.collection.find({ field_name : { $gte: value }}) // 大于等于: field >= value
db.collection.find({ field_name : { $lte: value }}) // 小于等于: field <= value
db.collection.find({ field_name : { $ne: value }}) // 不等于: field != value
#如:
db.collection_test.find(
{likenum: {$gt: NumberInt(999)}}
)
Ⅵ 包含查询
# 包含查询
db.collection.find({ field_name : { $in:[ value1, value2]}})
db.collection.find({ field_name : { $nin:[ value1, value2]}})
#如:
db.collection_test.find(
{likenum: {$in: [NumberInt(888), NumberInt(1000)]}}
)
Ⅶ 条件连接查询
# and连接
db.collection.find({ $and:[{}, {}] })
#如:
db.collection_test.find({
$and: [
{likenum: {$gte: NumberInt(900)}},
{likenum: {$lte: NumberInt(1000)}}
]
})
# or连接
db.collection.find({ $or:[{}, {}] })
#如:
db.collection_test.find({
$or: [
{likenum: {$lte: NumberInt(900)}},
{likenum: {$gte: NumberInt(950)}}
]
})
⑤ 操作小结
1. 选择切换数据库:use collection
2. 插入数据:db.collection.insert({bson数据})
3. 查询所有数据:db.collection.find()
4. 条件查询数据:db.collection.find({条件})
5. 查询符合条件的第一条记录:db.collection.findOne({条件})
6. 查询符合条件的前几条记录:db.collection.find({条件}).limit(条数)
7. 查询符合条件的跳过的记录:db.collection.find({条件}).skip(条数)
8. 修改数据:db.collection.updateOne({条件},{修改后的数据})
或 db.collection.updateOne({条件},{$set:{要修改部分的字段:数据})
或 db.collection.updateMany({条件},{修改后的数据})
9. 修改数据并自增某字段值:db.collection.updateOne({条件},{$inc:{自增的字段:步进值}})
10. 删除数据:db.collection.deleteOne({条件})
或 db.collection.deleteMany({条件})
11. 统计查询:db.collection.count({条件})
或 db.collection.countDocuments({条件})
或 db.collection.estimatedDocumentCount()
12. 模糊查询:db.collection.find({字段名:/正则表达式/})
13. 条件比较运算:db.collection.find({字段名:{$gt:值}})
14. 包含查询:db.collection.find({字段名:{$in:[值1,值2]}})
或 db.collection.find({字段名:{$nin:[值1,值2]}})
15. 条件连接查询:db.collection.find({$and:[{条件1},{条件2}]})
或 db.collection.find({$or:[{条件1},{条件2}]})
三、结尾
以上即为MongoDB-基础使用(一)的全部内容,感谢阅读。
网友评论