写在前面
本文仅作个人的学习笔记
#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: ""}} |