黑白客 发表于 2023-2-3 11:31

MongoDB入门级保姆教程

# 前言
MongoDB是文档数据库,旨在简化开发和扩展,本文主要介绍关键概念和基础语句并提供操作和管理上的注意事项。

---




# 1 文档数据库
数据结构,由字段和值对组成的数据结构。类似于json对象。值可以包括其它文档,数组和文档数组。
```java
{
    "userId":9
}
```
优点:
- 文档(即对象)对应于许多编程语言中的本机数据类型。
- 嵌入式文档和数组减少了连接成本
- 动态模式,支持流畅的多态性


MongoDB将文档存储在集合中。集合类似于关系数据库中的表。
除集合外,MongoDB还支持:
- 只读视图
- 按需实例化视图

# 2 主要功能

高性能:
                MongoDB提供高性能的数据持久性,特别是
               
- 对嵌入式数据模型的支持减少了数据库系统的I/O操作
- 索引支持更快的查询,并且可以包括来自嵌入式文档和数组的键

丰富的查询语言:
        MongoDB支持丰富的查询语言,以支持读写操作

高可用性:
        MongoDB的复制工具(副本集)提供:
- 故障自动转移
- 数据冗余
副本集是一组保持相同的数据集,从而提供冗余和提高数据可用性的MongoDB服务器

水平可伸缩性:
MongoDB提供水平可伸缩性作为其核心功能部分
- 分片在一组计算机集群分布数据

支持多种存储引擎:
- WiredTiger存储引擎(包括对静态加密的支持)
- 内存中存储引擎
- 此外,MongoDB提供可插拔的存储引擎API,允许第三方为MongoDB开发存储引擎
# 3 MongoDB Shell

在shell中,db代表数据库,输入db 会显示当前数据库
> db

如果还没有创建数据库,会显示test数据库,test数据库是MongoDB的默认数据库
切换数据库命令 use db
> use examples

`切换数据库之前,不需要提前创建数据库,在第一次存储数据时,如果不存在指定的数据库,MongoDB会自动创建数据库。`

MongoDB将数据存储在集合中,`集合相当于关系型数据库中的表`,如果不存在相应的表,会在第一次写入的时候创建
```java
db.testArray.insertMany(
   { item: "paper", qty: 10, status: "D", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
   { item: "planner", qty: 0, status: "D", size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "postcard", qty: 45, status: "A", size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
);

```
该操作返回一个确认指示符和一个包含id的成功插入的文档组数的数组。

查询testArray中的所有文档:


> db.testArray.find({})

要格式化结果,请追加.pretty() 到find操作:

> db.testArray.find({}).pretty()

条件查询:
返回其中statusfield等于的 文档"D"
> db.testArray.find( { status: "D" } );

返回其中qtyfield等于的 文档0
> db.testArray.find( { qty: 0 } );

其中qtyfield等于 0并且statusfield等于"D"
> db.testArray.find( { qty: 0, status: "D" } );

其中uom嵌套在size 文档内的字段等于"in"

> db.testArray.find( { "size.uom": "in" } )

其中size字段等于文档:{ h: 14, w: 21, uom: "cm" }
> db.testArray.find( { size: { h: 14, w: 21, uom: "cm" } } )

`嵌入式文档上的相等匹配要求完全匹配,包括字段顺序。`

其中tags数组包含"red"为其元素之一
> db.testArray.find( { tags: "red" } )

`如果该tags字段是字符串而不是数组,则查询只是一个相等匹配。`

返回该tags字段与指定数组完全匹配的文档,包括顺序
> db.testArray.find( { tags: [ "red", "blank" ] } )


在find中 第二个{} 中可以作为要排除或者要展示那些数据的参数
1 :返回文档中包含该字段
0 : 返回文档中排除该字段
从集合中返回_id item 和 status
> db.testArray.find( { }, { item: 1, status: 1 } );

`_id字段 即可返回该字段,默认情况下返回。如果想要排除 可以手动排除`

> db.testArray.find( {}, { _id: 0, item: 1, status: 1 } );

# 4 视图
MongoDB视图是可查询对象,其内容是其它集合或视图上聚合管道的定义。
MongoDB不会将视图持久化到磁盘上。
客户端查询视图时,将按需计算视图内容。
MongoDB可以要求客户端具有查询视图的权限。
MongoDB不支持针对视图的写入操作。

>创建视图
使用db.createCollection()方法或 create命令:
```java
db.createCollection(
"<viewName>",
{
    "viewOn" : "<source>",
    "pipeline" : [<pipeline>],
    "collation" : { <collation> }
}
)

```

> 使用db.createView()方法:

```java
db.createView(
"<viewName>",
"<source>",
[<pipeline>],
{
    "collation" : { <collation> }
}
)
```
> 必须在于源数据相同的数据库里创建视图

视图表现出以下行为:
1. 只读 视图是只读的;对视图的写操作将出错。
2. 使用索引和排序操作; 视图使用基础集合和索引/索引位于基础集合之上,因此无法在视图上创建,                  删除或重建索引,也无法在视图上获取索引列表。
3. 投影限制;不支持以下投影 运算符:
        - $
        - $elemMatch
        - $slice
        - $meta
4. 不可变名称;您不能重命名视图
5. 查看与整理
          - 您可以 在创建时为视图指定默认排序规则。如果未指定排序规则,则视图的默认排序规则是“简单”二进制比较排序规则。也就是说,视图不会继承集合的默认排序规则。
          - 视图上的字符串比较使用视图的默认排序规则。尝试更改或覆盖视图的默认排序规则的操作将失败,并显示错误。
          - 如果从另一个视图创建视图,则不能指定与源视图的排序规则不同的排序规则。
          - 如果执行涉及多个视图的聚合(例如with $lookup或)$graphLookup,则这些视图必须具有相同的排序规则。

> 若要删除视图,请使用视图上的db.collection.drop()方法。
> 您可以通过拖放并重新创建视图或使用collMod命令来修改视图。

King1993 发表于 2023-2-3 12:23

很适合新手,学习了,还是一个沙发 棒棒哒

engineerlzk 发表于 2023-2-3 13:25

学习学习,谢谢分享

野男人 发表于 2023-2-3 13:53

去年学了下mongodb 与mongoose 唉,边学边忘!

Paulwalkera 发表于 2023-2-3 14:34

边学边忘的东西 先收藏一下

ytfrdfiw 发表于 2023-2-3 14:41

感谢分享。学习一下。
页: [1]
查看完整版本: MongoDB入门级保姆教程