写在前面
本文仅作个人的学习笔记
#01 Get Started
MongoDB 是一个文档型数据库。与 SQL 不同,它是非关系型数据库。
MongoDB 可以把数据存在一起而不是分成多个表,因此它有着很快的读取速度。
在 MongoDB 里也可以把数据分为多个组,它们被叫做 collections(集合) 而不是 tables(表)。
这里使用的是 mongosh 来连接数据库。
1 | mongosh "mongodb+srv://cluster0.anmcend.mongodb.net/myFirstDatabase" --apiVersion 1 --username deffield62 |
连接成功后会得到以下信息
1 | PS C:\Users\Administrator> mongosh "mongodb+srv://cluster0.anmcend.mongodb.net/myFirstDatabase" --apiVersion 1 --username deffield62 |
报错处理
Error: queryTxt ETIMEOUT cluster0.anmcend.mongodb.net
MongoServerSelectionError: connection
to 23.101.10.160:27017 closed 在
SECURITY下的Network Access里面添加0.0.0.0/0即可(即不校验连接时的 IP)
#02 创建数据库 / 集合
输入 db 以查看目前在使用哪个数据库
1 | > db |
创建一个数据库
使用 use DatabaseName
如果数据库不存在,则创建数据库。然后切换到指定数据库。
1 | > use blog |
创建一个集合
使用 db.createCollection(name[, options])
name 是创建的集合名称
options 指定有关内存大小及索引的选项
| 字段 | 类型 | 描述 |
|---|---|---|
| capped | 布尔 | 如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
| size | 数值 | 为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。 |
| max | 数值 | 指定固定集合中包含文档的最大数量。 |
1 | > db.createCollection("posts") |
创建了一个集合 posts 。
创建了一个固定集合 articles ,整个集合空间大小 6142800 B, 文档最大个数为 10000 个。
展示所有的数据库 / 集合
使用 show dbs 展示所有数据库
1 | > show dbs |
空数据库不会在这里被列出来,因为空数据库实际上是不存在的
仅当被写入数据时,一个数据库才被实际地创建
使用 show collections 展示当前数据库里面的所有集合
1 | > show collections |
删除数据库 / 集合
使用 db.collectionName.drop() 以删除名为 collectionName 的集合
1 | > show collections |
使用 db.dropDatabase() 以删除当前数据库。
1 | > show dbs |
报错处理
MongoServerError: user is not allowed to do action [dropDatabase] on [test.]
如果是用的 Altas,需要去
SECURITY - Database Access添加权限在
Database User Privileges里将Built-in Role设置为Altas admin
#03 增查删改
增
使用 db.collectionName.insertOne(document) 插入单个文档。
document 是 BSON(一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称)格式。
1 | > db.posts.insertOne({ |
使用 db.collectionName.insertMany(documents) 插入多个文档。
documents 是由 document 组成的列表。
1 | > db.posts.insertMany([ |
如果 collectionName 不存在,会自动创建这个集合。
查
使用 db.collectionName.find([query, projection]) 来查询满足 query 的所有文档。
可使用 projection 以选择性地展示查询结果
在同一个 projection 中除了 _id 字段不能同时出现 0 和 1 。
1 | > db.posts.find({},{title: 1, body: 1, date: 1, _id: 0, likes: 1}) |
使用 db.collectionName.findOne([query,projection]) 以查找满足条件的第一个文档
1 | > db.posts.findOne({likes: 2}) |
查询操作符
比较
在查询操作符中,一般来说,
e表示equal,g表示greater,l表示less,t表示than,n表示not所以
$eq、$ne、$gt、$gte、$lt、$lte、$in分别表示:等于、不等于、大于、大于等于、小于、小于等于、属于逻辑
$and、$or、$not分别表示二者都、二者任一、二者都不(含不包含该字段的文档)$nor表示二者都不求值
$regex使用正则表达式匹配$text执行文本搜索$where使用 JS 表达式以匹配文档
更多操作符详见 官方文档
1 | # likes > 2 || title == "Post Title 2" |
删
使用 db.collectionName.deleteOne(query) 删除第一个满足 query 的文档
1 | > db.posts.deleteOne({ likes: 5, category: "Event" }) |
使用 db.collectionName.deleteMany(query) 删除所有满足 query 的文档
1 | > db.posts.deleteMany({ category: "Technology" }) |
改
使用 db.collectionName.updateOne(query, update[, upsert]) 以修改第一个满足 query 的文档
使用 db.collectionName.updateMany(query, update[, upsert]) 以修改所有满足 query 的文档
upsert 表示如果不存在 update 的记录是否新插入一个文档
1 | > db.posts.updateOne( { title: "Post Title 2" }, { $set: { likes: 9 } } ) |
修改操作符
更多修改操作符详见 官方文档
摘几个看着很有用的
| 操作符 | 描述 | 示例 |
|---|---|---|
$set |
设置字段对应的值 | {$set: {likes: <new value>}} |
$inc |
增加字段对应的值 | {$inc: {likes: -5}} |
$min |
与原字段值取最小 | {$min: {likes: 17}} |
$max |
与原字段值取最大 | {$max: {likes: 17}} |
$mul |
将原字段乘上某值 | {$mul: {likes: 3}} |
$rename |
修改字段名 | {$rename: {"nickname": "alias"}} |
$unset |
移除字段名 | {$unset: {quantity: ""}} |