Delete zh-cn/mongodb.html.markdown

This commit is contained in:
duzhuoshanwai 2024-08-18 10:30:17 +08:00 committed by GitHub
parent 16af462ba9
commit 1bc42acb52
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,374 +0,0 @@
---
language: MongoDB
filename: mongo.js
contributors:
- ["Raj Piskala", "https://www.rajpiskala.ml/"]
translator:
- ["duzhuoshanwai", "https://blog.saint1337.top"]
---
MongoDB 是一种用于高容量数据存储的 NoSQL 文档数据库。
MongoDB 使用集合collections和文档documents进行存储。每个文档由键值对key-value pairs组成采用类似 JSON 的语法,类似于字典或 JavaScript 对象。
同样,由于 MongoDB 是 NoSQL 数据库,它使用自己的查询语言 Mongo
Query LanguageMQL该语言使用 JSON 进行查询。
## 入门
### 安装
MongoDB 的本地安装说明可以参考
[官方的安装手册](https://docs.mongodb.com/manual/installation/) 或者你可以注册[MongoDB Atlas](https://www.mongodb.com/cloud/atlas/register)白嫖到一个免费的 512MB 集群。文章底部还有关于设置的教程视频链接.
本教程假设你已经从[https://www.mongodb.com/try/download/shell](https://www.mongodb.com/try/download/shell)下载了 MongoDB Shell。你也可以从同一链接下方下载带有图形界面的工具 MongoDB Compass。
### 组件
安装 MongoDB 后,你会发现其中包含多个命令行工具。
其中最重要的三个是:
- `mongod` - 数据库服务器,负责管理数据和处理查询信息,可以以单机模式运行,也可以作为集群的一部分运行
- `mongos` - 分片集群中的路由器,充当客户端和分片集群之间的接口,负责将客户端请求路由到正确的分片节点,并聚合来自多个分片节点的结果
- `mongo` - 数据库 shell基于 JavaScript用来配置和管理 MongoDB 数据库。
通常,我们先启动 `mongod` 进程,然后在另一个终端中使用 `mongo` 来访问和修改我们的集合。
### JSON & BSON
虽然 MongoDB 中的查询使用 类JSON\* 的格式,但 MongoDB 在内部将其文档存储为 BSONBinary JSON
因为 BSON 是二进制编码,所以它不像 JSON 一样可以阅读。
但这也使得用户能够访问比普通 JSON 更多的数据类型,例如整数或浮点数。也支持很多其他类型,比如正则表达式、日期或二进制数据。
[这里](https://docs.mongodb.com/manual/reference/bson-types/) 列出了MongoDB支持的所有数据类型。
- 我们这里使用 类JSONJSON-like而不是直接使用 JSON 是因为它可以包含扩展的类型。 例如,你可以在 MongoDB 中直接使用正则表达式或时间戳进行查询,并且你还可以接收包含这些类型的数据。
```js
/////////////////////////////////////////////////////////
/////////////////// Getting Started /////////////////////
/////////////////////////////////////////////////////////
// 启动 MongoDB 服务器
// 注意 - 你需要在一个单独的终端中执行此操作,因为该过程会占用整个终端。
// 使用 --fork 选项会以守护进程方式启动
// 使用 --logpath /var/log/mongodb/mongod.log 会将日志输出到文件 /var/log/mongodb/mongod.log
mongod // --fork --logpath /var/log/mongodb/mongod.log
// 连接到一个远程 MongoDB 服务器 这里的admin是数据库名称
// mongo "mongodb+srv://host.ip.address/admin" --username your-username
// Mongoshell 内置了一个完善的 JavaScript 解释器。
3 + 2 // 5
// 显示可用数据库
// MongoDB 内置了以下数据库admin、config、local
show dbs
// 切换到一个新数据库(可以是已经存在的或你想要创建的)
// 注意:在 MongoDB 中没有专门的 "create" 命令来创建数据库。
// 数据库会在向集合中插入数据时自动创建
use employees
// 创建新集合Collections
// 注意:插入文档时会自动创建集合,因此不需要提前创建
db.createCollection('engineers')
db.createCollection('doctors')
// 查看employees数据库中的所有集合
show collections
/////////////////////////////////////////////////////////
// Basic Create/Read/Update/Delete (CRUD) Operations: ///
/////////////////////////////////////////////////////////
/////////////// Insert (Create) /////////////////////////
// 向数据库中添加新的 employee 记录
// 每次插入数据都会返回 true 或 false
// 每个文档都会自动分配一个唯一的 `_id`
db.engineers.insertOne({ name: "Jane Doe", age: 21, gender: 'Female' })
// 向 `engineers` 集合中插入一组员工记录
// 可以作为包含对象的数组进行插入
db.engineers.insert([
{ name: "Foo Bar", age: 25, gender: 'Male' },
{ name: "Baz Qux", age: 27, gender: 'Other' },
])
// MongoDB 对插入对象的模式或结构没有强制要求
// 例如,向 `engineers` 集合中插入一个空对象
db.engineers.insertOne({})
/// 字段是可选的,并且不必与其他文档匹配
// 比如下面插入的文档中 没有 age 字段
db.engineers.insertOne({ name: "Your Name", gender: "Male" })
// 数据类型可以不同,并且在插入时会被保留
// 在某些编程语言中,这可能需要额外的验证以防止问题
db.engineers.insert({ name: ['Foo', 'Bar'], age: 3.14, gender: true })
// 对象或数组可以嵌套在文档内
db.engineers.insertOne({
name: "Your Name",
gender: "Female",
skilledIn: [
"MongoDB",
"NoSQL",
],
"date-of-birth": {
"date": 1993-07-20T09:44:18.674Z,
"age": 26
},
})
// 我们可以自定义覆盖 `_id` 字段的值
// 比如下面的操作
db.engineers.insertOne({
_id: 1,
name: "An Engineer",
age: 25,
gender: "Female",
})
// 但是需要注意,`_id` 的值在集合中必须保持唯一,否则插入操作会失败
// 如果 `_id` 是重复值,插入会失败并返回 WriteError 错误,并表明 `_id` 出现重复
db.engineers.insertOne({
_id: 1,
name: "Another Engineer",
age: 25,
gender: "Male",
})
// `_id` 只在需要在当前的集合中保持唯一
// 例如,这里我们将数据插入 doctors 集合
db.doctors.insertOne({
_id: 1,
name: "Some Doctor",
age: 26,
gender: "Other",
})
/////////////////// Find (Read) ////////////////////////
// 查询的形式是 db.collectionName.find(<filter>)
// 其中 <filter> 是一个对象
// 显示我们数据库中目前的所有内容,每次最多显示 20 个文档
// 按 i 键可以翻页到下面 20 个文档
db.engineers.find({})
// 我们可以对 find() 查询的结果进行格式化打印
db.engineers.find({}).pretty()
// MongoDB 查询使用 JavaScript 对象并搜索具有匹配键值对的文档
// 返回第一个匹配查询条件的文档
// 注意:插入的顺序在数据库中不会被保留,因此输出可能会有所不同
db.engineers.findOne({ name: 'Foo Bar' })
/// 返回所有具有匹配键值对key-value属性的文档并以游标Cursor形式返回
// 游标可以使用 .toArray() 转换为数组
db.engineers.find({ age: 25 })//.toArray()
// 查询时类型非常重要
// 因为上面的所有年龄都是整数类型,所以下面使用字符型的查询不会返回任何结果
db.engineers.find({ age: '25' })
// find() 支持嵌套对象和数组,就像创建时一样
db.engineers.find({
name: "Your Name",
gender: "Female",
skilledIn: [
"MongoDB",
"NoSQL"
],
"date-of-birth": {
"date": new Date("1993-07-20T09:44:18.674Z"), // 使用 ISO 日期格式
"age": 26
}
})
///////////////////////// Update ////////////////////////
// 修改的形式是 db.collectionName.update(<filter>, <update>)
// 注意:<update> 总是使用 $set 操作符。
// 后面会介绍其他一些操作符。
// 修改单个文档
db.engineers.updateOne({ name: 'Foo Bar' }, { $set: { name: 'John Doe', age: 100 }})
// 修改多个文档
db.engineers.update({ age: 25 }, { $set: { age: 26 }})
// We can use { upsert: true } if we would like it to insert if the document doesn't already exist,
// or to update if it does
// Returns matched, upserted, modified count
// 使用 { upsert: true } 选项
// 如果文档存在则会被修改,如果不存在会自动创建
// 返回匹配的、插入的、修改的文档数量以及新创建文档的 `_id`
db.engineers.update({ name: 'Foo Baz' },
{ $set:
{
age: 26,
gender: 'Other'
}
},
{ upsert: true } // 如果文档不存在,则插入新文档;如果存在,则更新现有文档
)
/////////////////////// Delete /////////////////////////
// 删除文档的形式是 db.collectionName.delete(<filter>)
// 删除第一个匹配查询条件的文档,返回 deletedCount
db.engineers.deleteOne({ name: 'Foo Baz' })
// 一次删除匹配的多个文档
db.engineers.deleteMany({ gender: 'Male' })
// 注意:有两个方法 db.collection.removeOne(<filter>) 和
// db.collection.removeMany(<filter>) 也可以用于删除文档,但它们的返回值略有不同。
// 建议只使用 deleteOne() 和 deleteMany() 保证代码的兼容性。
// 这里没有包括这些方法,因为它们在 NodeJS 的数据库驱动中已被弃用。
/////////////////////////////////////////////////////////
//////////////////// Operators //////////////////////////
/////////////////////////////////////////////////////////
// Operators in MongoDB have a $ prefix. For this tutorial, we are only looking
// at comparison and logical operators, but there are many other types of
// operators
// MongoDB 中的运算符(操作符)都有一个 $ 前缀。在本教程中,我们只讨论比较和逻辑运算符,
// 但实际上还有许多其他类型的运算符。
//////////////// Comparison Operators ///////////////////
//查找所有大于或大于等于某个条件的项。
db.engineers.find({ age: { $gt: 25 }}) // 查找 `age` 大于 25 的文档
db.engineers.find({ age: { $gte: 25 }}) // 查找 `age` 大于或者等于 25 的文档
//查找所有小于或小于等于某个条件的项。
db.engineers.find({ age: { $lt: 25 }}) // 查找 `age` 小于 25 的文档
db.engineers.find({ age: { $lte: 25 }}) // 查找 `age` 小于或者等于 25 的文档
// 查找等于或者不等于某个条件的项。
// 注意:在你没有指定查询条件的时候自动使用'$eq'。
db.engineers.find({ age: { $eq: 25 }}) // 查找 `age` 不等于 25 的文档
db.engineers.find({ age: { $ne: 25 }}) // 查找 `age` 不等于 25 的文档
// 查找所有匹配数组中任意一个元素的文档,或不在数组中的文档
db.engineers.find({ age: { $in: [ 20, 23, 24, 25 ]}})
db.engineers.find({ age: { $nin: [ 20, 23, 24, 25 ]}})
//////////////// Logical Operators ///////////////////
// 将两个查询条件连接在一起
// 注意MongoDB 在没有指定连接条件时会自动使用 '$and'
db.engineers.find({ $and: [
gender: 'Female',
age: {
$gte: 18
}
]})
// 匹配任意一个查询条件
// 例如这里会返回符合 gender 为 'Female' 的文档,或符合 age 大于或等于 18 的文档
db.engineers.find({ $or: [
gender: 'Female',
age: {
$gte: 18
}
]})
// 取与查询结果相反的部分
// 这里返回 gender 不为 'Female' 的文档
db.engineers.find({ $not: {
gender: 'Female'
}})
// 必须不匹配任意一个查询条件
// 这里返回既不满足 gender 为 'Female',又不满足 age 大于或等于 18 的文档
db.engineers.find({ $nor: [
{ gender: 'Female' },
{ age: { $gte: 18 } }
]})
/////////////////////////////////////////////////////////
//////////////// Database Operations: ///////////////////
/////////////////////////////////////////////////////////
// 删除 (drop) `employees` 数据库
// 这将删除数据库中的所有文档!
db.dropDatabase()
// 创建一个带有一些数据的新数据库
use example // 使用 example 数据库
db.test.insertOne({ name: "Testing data, please ignore!", type: "Test" }) // 向test集合中添加一条文档
// 退出 Mongo shell
exit
// 导入/导出 数据库BSON格式
// 使用 `mongodump` 导出所有数据库的数据为 BSON 格式
// 导出的数据保存在 "MongoDB Database Tools/bin/dump" 目录下
// MongoDB Database Tools 的具体位置以你的操作系统和安装方式为准
// 注意:如果找不到该命令,请导航到 "MongoDB Database Tools/bin" 并从那里使用可执行文件 mongodump确保你有执行权限
// 使用 `mongorestore` 从 BSON 数据中恢复数据库
mongorestore dump
// 默认情况会在 dump 文件夹查找文件,也可以自定义文件路径
mongorestore /path/to/your/dump
// 导入/导出 数据库JSON 格式):
// 使用 `mongoexport` 将所有数据库的数据导出为 JSON 格式
mongoexport --collection=example
// 使用 `mongoimport` 将 JSON 格式的数据导入到数据库中
mongoimport --collection=example
```
## 进阶阅读
### 安装以及设置视频
- [Install MongoDB - Windows 10](https://www.youtube.com/watch?v=85A6m1soKww)
- [Install MongoDB - Mac](https://www.youtube.com/watch?v=DX15WbKidXY)
- [Install MongoDB - Linux (Ubuntu)](https://www.youtube.com/watch?v=wD_2pojFWoE)
### 输入验证
根据上面的示例,如果输入验证或结构是一个问题,我建议查看以下 ORMs对象关系映射允许用户使用面向对象方式来操作数据库
- [Mongoose (Node.js)](https://mongoosejs.com/docs/) - 通过支持类型、必需值、最小值和最大值的模式进行输入验证。
- [MongoEngine (Python)](http://mongoengine.org/) - 类似于 Mongoose但我发现它在某些方面有些限制
- [MongoKit (Python)](https://github.com/namlook/mongokit) - 另一个比 MongoEngine 更容易使用的替代方案
对于静态强类型语言(如 Java、C++、Rust输入验证通常不需要库因为它们在编译时定义了类型和结构。
### 资源
如果你有时间,我强烈推荐 [MongoDB University](https://university.mongodb.com/) 的课程。它们由 MongoDB 自己制作,更详细,同时仍然简明扼要。这些课程结合了视频和测试问题,这是我获取 MongoDB 知识的方式。
我推荐以下视频系列来学习 MongoDB
- [MongoDB Crash Course - Traversy
Media](https://www.youtube.com/watch?v=-56x56UppqQ)
- [MongoDB Tutorial for Beginners -
Amigoscode](https://www.youtube.com/watch?v=Www6cTUymCY)
我之前使用过的与特定语言相关的资源:
- [Build A REST API With Node.js, Express, & MongoDB - Web Dev
Simplified](https://www.youtube.com/watch?v=fgTGADljAeg)
- [MongoDB with Python Crash Course - Tutorial for Beginners -
FreeCodeCamp](https://www.youtube.com/watch?v=E-1xI85Zog8)
- [How to Use MongoDB with Java - Random
Coder](https://www.youtube.com/watch?v=reYPUvu2Giw)
- [An Introduction to Using MongoDB with Rust -
MongoDB](https://www.youtube.com/watch?v=qFlftfLGwPM)
以上大部分信息与 [MongoDB 文档](https://www.mongodb.com/) 交叉引用。以下是每个部分的文档链接:
- [MongoDB Types](https://docs.mongodb.com/manual/reference/bson-types/) - 列出 MongoDB 本地支持的所有类型
- [MongoDB Operators](https://docs.mongodb.com/manual/reference/operator/) - 列出 MongoDB 本地支持的运算符