文章目录
1. MongoDB相关了解
1.1 简介
- MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种;
- 支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活;
- MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
1.1 应用场景
传统的关系型数据库(eg:mysql),在应对“三高”需求面前显得力不从心。
解释说明三高:
- 对数据库的高并发读写
- 对海量数据的高效率存储和访问
- 对数据库的高可扩展性和高可用性
具体应用场景举例:
- 社交场景。存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
- 游戏场景。存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
- 物流场景。存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
- 物联网场景。存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
- 视频直播。存储用户信息、点赞互动信息等。
1.2 什么时候选择mongoDB
- 数据量大
- 读写操作比较频繁
- 数据价值较低,对事务性要求不高
- 不需要复杂的join支持
- 应用需要2000-3000以上的读写QPS
- 需要TB甚至 PB 级别数据存储
1.3 结构型数据库和Mongodb对比
结构型数据库 | MongoDB | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
index | index | 索引 |
join | ---- | 表连接,mongodb不支持($lookup似乎可以实现,个人没有了解过) |
2. 相关基本操作
2.1 数据库相关
2.1.1 查看有权限查看的所有的数据库命令
show dbs;
2.1.2 选择或创建数据库
如果articledb不存在,则将自动创建该数据库
use articledb;
注意:
- 在mongodb中,集合只有在文档内容插入后才会真正创建!
- 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库
(1) admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限;
(2) local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合;
(3) config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
2.1.2 数据库的删除
#数据库删除
db.dropDatabase()
2.2 文档插入
如果插入时集合不存在,则会隐式地自动创建该集合。
格式:
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
2.2.1 单条插入
举例:
db.comment.insert(
{
"articleid": "100000",
"content": "今天天气真好,阳光明 媚",
"userid": "1001",
"nickname": "Rose",
"createdatetime": new Date(),
"likenum": NumberInt(10),
"state": null
}
)
注意:
- mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题
- 插入当前日期使用 new Date()
- 插入的数据没有指定 _id ,会自动生成主键值
- 如果某字段没值,可以赋值为null,或不写该字段
- 文档中的键/值对是有序的
2.2.2 批量插入
db.comment.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"
}
]
);
2.3 文档查询
基本格式:
db.collection.find(<query>, [projection])
query | projection |
---|---|
可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档( {} ) | 可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段,请省略此参数。 |
2.3.1 普通查询
查询comment集合中的articleid="100000"的文档,并只显示_id、userid、nickname、articleid字段
#查询。显示指定字段
db.comment.find(
{
articleid: "100000"
},
{
_id: 1,
userid: 1,
nickname: 1,
articleid: 1
}
);
2.3.2 分页查询
- 统计查询count()
统计userid = "1003"的文档个数,不写条件则为统计所有
db.comment.count({
"userid": "1003"
})
- 分页列表查询
使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据
db.collection.find().limit(NUMBER).skip(NUMBER)
举例:
页长为3进行分页显示
//第一页
db.comment.find().skip(0).limit(3)
//第二页
db.comment.find().skip(3).limit(3)
2.3.3 排序查询
sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
db.collection.find().sort({KEY:1})
举例:
对userid降序排列、对访问量升序排列
db.comment.find().sort({
userid: 1,
likenum: - 1
})
2.3.4 正则查询
格式:
db.collection.find({field:/正则表达式/})
举例:
查询评论内容包含“开水”的所有文档
db.comment.find({
content: /开水/
})
查询评论的内容中以“专家”开头
db.comment.find({
content: /^专家/
})
2.3.5 比较查询$gte
格式:
db.集合名称.find({ "field" : { $gte: value }})
举例:
db.comment.find({
likenum: {
$gt: NumberInt(700)
}
})
2.3.6 包含查询$in、$nin
查询userid等于1002或1003的文档
db.comment.find({
userid: {
$in: ["1002", "1003"]
}
})
查询userid不等于1002或1003的文档
db.comment.find({
userid: {
$nin: ["1002", "1003"]
}
})
2.3.7 条件连接查询$and、$or
查询likenum>=1000&&likenum<=2000&&state = "1"的文档
db.comment.find({
$and: [
{
likenum: {
$gte: 1000
}
},
{
likenum: {
$lte: 2000
}
},
{
state: "1"
}
]
})
查询likenum=2000 || content like %开水%的
db.comment.find({
$or: [
{
likenum: 2000
},
{
content: /开水/
}
]
})
2.4 文档更新
基本格式:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2
}
)
2.4.1 覆盖更新
覆盖整个文档更新。更comment集合中_id = ObjectId(“61a04d755d5900001f003637”)的文档
#更新指定文档,会覆盖整个文档
db.comment.update(
{
_id: ObjectId("61a04d755d5900001f003637")
},
{
nickname: "qushuai"
}
);
2.4.2 非覆盖更新(一条)
更新第一条,只更新指定字段。更comment集合中_id = "1"的文档,并只更新nickname字段
db.comment.update(
{
_id: "1"
},
{
$set: {
nickname: "叱咤风云"
}
}
);
2.4.3 非覆盖更新(all)
更新所有匹配的文档
db.comment.update(
{
userid: "1003"
},
{
$set: {
nickname: "吴京2"
}
},
{
multi: true
}
)
2.4.4 $inc增长
db.comment.update(
{
userid: "1003"
},
{
$inc: {
likenum: NumberInt(1)
}
},
{
multi: true
}
)
2.7 文档删除
- 删除comment文档中userid = "1003"的文档
db.comment.remove(
{
userid: "1003"
}
)
- 删除comment文档中的全部数据
db.comment.remove({})