MongoDB之入门记录总结
- 一、MongoDB
- 二、使用Atlas免费MongoDB云数据库
- 三、MongoDB操作工具
- 四、相关术语概念
- 五、用户管理
- 六、MongoDB基本操作
- 七、Python操作MongoDB
- 八、MongoDB聚合框架
- 九、复制集的作用
一、MongoDB
MongoDB概述
MongoDB特点
1、MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易
2、可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序
3、你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性
4、如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
5、Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
6、MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段
7、Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作
8、Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理
9、Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作
10、GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件
11、MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可
12、MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
13、MongoDB安装简单
安装MongoDB
Docker安装MongoDB
拉取镜像
docker pull mongo
创建和启动容器
docker run -d --restart=always -p 27017:27017 --name mymongo -v $PWD/db:/data/db -d mongo
进入容器
docker exec -it mymongo /bin/bash
使用MongoDB客户端进行操作
root@d8110bf377a7:/# mongo
MongoDB shell version v5.0.5
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("8157afb1-535f-4b9c-9aef-5f6a0e32c5a2") }
MongoDB server version: 5.0.5
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
Welcome to the MongoDB shell.
查询所有的数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
Windows安装MongoDB
官网下载Mongodb服务器
双击安装,选择Custom自定义安装路径
视情况选择,data:数据库路径 log:日志路径
安装完毕后,自动将MongoDB加入到系统服务
MongoDB服务相关命令
启动MongoDB服务
net start MongoDB
关闭MongoDB服务
net stop MongoDB
移除MongoDB服务
"D:\program files\mongodb\Server\4.4\bin\mongod.exe" ‐‐remove
安装MongoDB服务
mongod.exe ‐‐config "D:\program files\mongodb\Server\4.4\bin\mongod.cfg" ‐‐install
若不是安装包形式安装,只需在mongod.exe目录指定一个配置文件mongodb.conf ,以指定配置文件形式安装
#数据库路径
dbpath=D:\program files\mongodb\Server\4.4\data
#日志输出文件路径
logpath=D:\program files\mongodb\Server\4.4\log\mongod.log
#错误日志采用追加模式
logappend=true
#启用日志文件,默认启用
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true
#端口号 默认为27017
port=27017
二、使用Atlas免费MongoDB云数据库
Atlas免费服务即官方提供云托管MongoDB数据库。
官网地址:https://www.mongodb.com/zh-cn/cloud/atlas
申请云数据库
1.注册账号
2.设置账户信息
3.选择shared类型服务
4.选择云提供商和区域
5.等待自动部署集群服务
6.部署完成
7.点击Connet,添加访问IP与添加访问账户
8.获取连接地址
选择连接方式,如:MongoDB Shell
复制连接地址字符串
9.连接测试
安装MongoDB Shell 或不安装,使用mongo命令也可连接
C:\Users\Administrator>mongo "mongodb+srv://cluster0.ruiuw.mongodb.net/myFirstDatabase" --username root
MongoDB shell version v4.4.2
Enter password:
connecting to: mongodb://cluster0-shard-00-00.ruiuw.mongodb.net:27017,cluster0-shard-00-02.ruiuw.mongodb.net:27017,cluster0-shard-00-01.ruiuw.mongodb.net:27017/myFirstDatabase?authSource=admin&compressors=disabled&gssapiServiceName=mongodb&replicaSet=atlas-hnmioy-shard-0&ssl=true
Implicit session: session { "id" : UUID("6c75e4f3-7bea-4d1e-acc7-12dc4ab1ceb1") }
MongoDB server version: 4.4.8
MongoDB Enterprise atlas-hnmioy-shard-0:PRIMARY>
三、MongoDB操作工具
MongoDB Compass
官网地址: https://www.mongodb.com/try/download/tools
MongoDB Compass是官方提供的免费 GUI 管理工具,包含如下功能
数据管理(增删改查)
Schema 管理
索引管理
性能排查
实时性能监控
连接Atlas免费MongoDB云数据库:输入连接: mongodb+srv://账户:密码@cluster0.ruiuw.mongodb.net/myFirstDatabase
测试
添加数据库:demo
添加集合:user
添加一条数据
选择集合user即能看到MongoDB Compass提供的功能,如:Documents,Aggregations,Schema…
Studio 3T
Studio 3T是mongodb优秀的客户端工具。
Studio 3T官网: https://studio3t.com/download/#windows
双击运行,直接安装
创建一个连接,同时填写连接信息。
选择配置好的一个连接
连接成功
四、相关术语概念
在mongodb中是通过数据库、集合、文档的方式来管理数据,与关系型数据库类似。
SQL 术语/概念书 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接(MongoDB不支持) | |
primary key | primary key | 主键,MongoDB自动在每个集合的文档中添加_id的主键 |
数据库
Help查看命令提示
db.help();
切换/创建数据库(如果数据库不存在,则创建数据库,否则切换到指定数据库)
use test
查询所有数据库
show dbs;
删除当前使用数据库
db.dropDatabase();
查看当前使用的数据库
db.getName();
显示当前db状态
db.stats();
当前db版本
db.version();
查看当前db的链接机器地址
db.getMongo〇;
文档
RDBMS与MongoDB对应的术语
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | 主键 (MongoDB 提供了 key 为 _id ) |
需要注意的是:
文档中的键/值对是有序的
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)
MongoDB区分类型和大小写
MongoDB的文档不能有重复的键
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符
文档键命名规范:
键不能含有\0 (空字符)。这个字符用来表示键的结尾
.和$有特别的意义,只有在特定环境下才能使用
以下划线"_"开头的键是保留的(不是严格要求的)
集合
创建一个集合(table)
db.createCollection( "collName");
得到指定名称的集合(table )
db.getCollection("user");
数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位 |
Boolean | 布尔值。用于存储布尔值(真/假) |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键 |
Timestamp | 时间戳。记录文档修改或添加的具体时间 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息 |
Object ID | 对象 ID。用于创建文档的 ID |
Binary Data | 二进制数据。用于存储二进制数据 |
Code | 代码类型。用于在文档中存储 JavaScript 代码 |
Regular expression | 正则表达式类型。用于存储正则表达式 |
连接命令格式
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 固定前缀
username:账号,可不填
password:密码,可不填
host:主机名或ip地址,只有host主机名为必填项
port:端口,可不填,默认27017
/database:连接某一个数据库
?options:连接参数,key/value对
mongodb://localhost 连接本地数据库27017端口
mongodb://root:123456@localhost 使用用户名root密码为123456连接本地数据库27017端口
mongodb://localhost:27017,localhost:27018,localhost:27019,连接三台主从服务器,端口为27017、27018、27019
五、用户管理
内置角色
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3 . 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
创建用户
语法格式:
mongo>db.createUser(
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]}
)
创建root用户,角色为root
use admin
db.createUser(
{
user:"root",
pwd:"root",
roles:[{role:"root",db:"admin"}]
}
)
认证登录
monogod.cfg配置文件可以是yaml格式也可以是键值对格式。
A.键值对
在mono.conf中设置 auth=true
B.yaml格式
#security:
security:
authorization: enabled
重启Mongodb
C:\WINDOWS\system32>net stop mongodb
MongoDB Server (MongoDB) 服务正在停止.
MongoDB Server (MongoDB) 服务已成功停止。
C:\WINDOWS\system32>net start mongodb
MongoDB Server (MongoDB) 服务正在启动 .
MongoDB Server (MongoDB) 服务已经启动成功。
使用账号和密码连接数据库
mongo.exe ‐u root ‐p root‐‐authenticationDatabase admin
查询用户
查询admin库下所有用户:
use admin
show users
修改用户
语法格式:
db.updateUser(
"<username>",
{
customData : { <any information> },
roles : [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
pwd: "<cleartext password>"
},
writeConcern: { <write concern> })
创建test用户:
db.createUser(
{
user:"test",
pwd:"test",
roles:[{role:"root",db:"admin"}]
}
)
修改test用户的角色为readWriteAnyDatabase
use admin
db.updateUser("test",{roles:[{role:"readWriteAnyDatabase",db:"admin"}]})
修改密码
语法格式:
db.changeUserPassword("username","newPasswd")
修改 test用户的密码为123
se admin
db.changeUserPassword("test","123")
删除用户
语法格式:
db.dropUser("用户名")
删除test用户:
db.dropUser("test")
六、MongoDB基本操作
数据库操作
查询
show dbs 查询全部数据库
db 显示当前数据库
创建数据库
use DATABASE_NAME
use demodb :有demodb数据库则切换过去,否则创建,新创建的数据库不显示,需要至少包括一个集合。
删除数据库
使用 db.dropDatabase() 来删除数据库
数据库相应文件也会被删除,磁盘空间将被释放
先切换数据库:use demodb
再执行删除:db.dropDatabase()
use demo
db.dropDatabase()
集合操作
集合相当于关系数据库中的表,一个数据库可以创建多个集合,一个集合是将相同类型的文档管理起来。
创建集合
db.createCollection(name, options)
name: 新创建的集合名称
options: 创建参数
db.createCollection(user) : 创建user集合
删除集合
db.<集合>.drop() 删除一个集合
集合中的全部文档都会被删除
集合相关的索引也会被删除
db.collection_name.drop()
db.user.drop() : 删除user集合
文档操作
mongodb中文档的格式是json格式,使用 insert() 或 save() 方法向集合中插入文档
insert插入文档
insert单条数据
db.<集合>.insertOne(<JSON对象>)
insert多条数据
db.<集合>.insertMany([<JSON 1>, <JSON 2>, …<JSON n>])
示例
db.COLLECTION_NAME.insert(document)
db.demoDb.insert({"name":"lisi","age":12})
{
"_id" : ObjectId("5fc7a1a39b84bb20d9911830"),
"name" : "lisi",
"age" : 12.0
}
update更新文档
语法格式:
db.collection.update(
<query>,
<update>,
<options>
)
query:查询条件,相当于sql语句的where
update:更新文档内容
options:选项
1、替换文档
将符合条件 “name”:"lisi"的第一个文档替换为{“name”:“wangwu”,“age”:22.0}。
db.user.update({"name" : "lisi"},{"name" : "wangwu", "age" : 22.0})
2、$set修改
使用$set修改器指定要更新的key,key不存在则创建,存在则更新。
db.user.update({"name" : "lisi"},{$set:{"age":22}})
将符合条件 “name”:"wangwu"的所有文档更新name和age的值。
db.user.update({"name" : "wangwu"},{$set:{"name" : "lisi", "age" : 33.0}},{multi:true})
multi:false表示更新第一个匹配的文档,true表示更新所有匹配的文档。
updateOne表示无论条件匹配多少条记录,始终只更新第一条
updateMany表示条件匹配多少条就更新多少条
updateOne/updateMany方法要求更新条件部分必须具有以下之一,否则将报错:
$set/$unset
$push/$pushAll/$pop
$pull/$pullAll
$addToSet
db.user.updateOne({"age":21},{$set:{"name":"name111"}})
更新数组
$push: 增加一个对象到数组底部
$pushAll: 增加多个对象到数组底部
$pop: 从数组底部删除一个对象
$pull: 如果匹配指定的值,从数组中删除相应的对象
$pullAll: 如果匹配任意的值,从数据中删除相应的对象
$addToSet: 如果不存在则增加一个值到数组
Remove删除文档
db.student.remove(<query>)
query:删除条件,相当于sql语句中的where
删除全部
db.student.remove({})
按条件删除
db.student.remove({"name":"wangwu"})
remove命令需要配合查询条件使用;
匹配查询条件的的文档会被删除;
指定一个空文档条件会删除所有文档;
find查询文档
db.collection.find(query, projection)
query:查询条件,可不填
projection:投影查询key,可不填
查询全部
db.student.find()
查询符合条件的记录
查询age为33的文档
db.user.find({"age":33})
投影查询
db.集合名称.find( {查询条件} , {_id : 0, 字段A : 1, 字段B : 1} )
第1个参数: 查询条件
第2个参数: 控制想要返回文档的哪些字段,1:返回 0:不返回
单条件查询
db.user.find({"age":21});
多条件and查询
db.user.find({"name":"测试","age":21});
db.user.find({$and : [{"name":"测试"},{"age":21}]});
多条件 or 查询
db.user.find({$or : [{"name":"测试"},{"age":25}]});
按正则表达式查找
db.user.find({"name":/^测*/});
搜索子文档,使用“field.sub_field”的形式查询子文档
{
"_id": {
"$oid": "61330facbf0bf2331163f17a"
},
"name": "测试",
"age": 21,
"address": {"name":"address1"}
}
db.user.find( { "address.name" : "address1"})
对数组中的元素进行搜索
{
"_id": {
"$oid": "61330facbf0bf2331163f17a"
},
"address": ["address1", "address2"]
}
db.user.find( { "address" : "address1"})
db.user.find( { $or: [{"address" : "address1"},{"address" : "address2"}]})
搜索数组中的对象
{
"_id": {
"$oid": "61330facbf0bf2331163f17a"
},
"users":[{"name":"name1","age":22},{"name":"name2","age":23}]
}
db.user.find({"users.name":"name2"})
db.user.find({"users.name":"name2","users.age":23})
// 索子对象的多个字段时,如果使用 $elemMatch,它表示必须是同一个子对象满足多个条件。
db.user.find({"users":{$elemMatch:{"name":"name1","age":22}}})
控制返回的字段
find可以指定只返回指定的字段;
_id字段必须明确指明不返回,否则默认返回;
在MongoDB中称这为投影(projection)
db.user.find({"name":"测试"},{"_id":0,"name":1,"age":1})
{ name: '测试', age: 21 }
只显示name和age两个key,_id主键不显示。
db.user.find({"name":"lisi"},{name:1,age:1,_id:0})
查询逻辑运算符
$lt: 存在并小于
$lte: 存在并小于等于
$gt: 存在并大于
$gte: 存在并大于等于
$ne: 不存在或存在但不等于
$in: 存在并在指定数组中
$nin: 不存在或不在指定数组中
$or: 匹配两个或多个条件中的一个
$and: 匹配全部条件
查询条件对照表
SQL | MQL |
---|---|
a = 1 | {a: 1} |
a <> 1 | {a: {$ne: 1}} |
a > 1 | {a: {$gt: 1}} |
a >= 1 | {a: {$gte: 1}} |
a < 1 | {a: {$lt: 1}} |
a <= 1 | {a: {$lte: 1}} |
查询逻辑对照表
SQL | MQL |
---|---|
a = 1 AND b = 1 | {a: 1, b: 1} 或 {$and: [{a: 1}, {b: 1}]} |
a = 1 OR b = 1 | {$or: [{a: 1}, {b: 1}]} |
a IS NULL | {a: {$exists: false}} |
a IN (1, 2, 3) | {a: {$in: [1, 2, 3]}} |
索引操作
语法格式:
db.collection.createIndex(keys, options)
title为创建的索引字段,1指定按升序创建索引, -1按降序来创建索引
db.col.createIndex({"title":1})
设置使用多个字段创建索引(关系型数据库中称作复合索引)
db.col.createIndex({"title":1,"description":-1})
七、Python操作MongoDB
安装MongoDB驱动
pip install pymongo
C:\Users\Administrator>pip install pymongo
Looking in indexes: https://pypi.douban.com/simple/
Collecting pymongo
Downloading https://pypi.doubanio.com/packages/73/9d/2ab0027be0b5202e7f9264f1c47748f6a0b74752f66a64efc3710ade0b0e/pymongo-3.12.0-cp39-cp39-win_amd64.whl (397 kB)
|████████████████████████████████| 397 kB 726 kB/s
Installing collected packages: pymongo
Successfully installed pymongo-3.12.0
WARNING: You are using pip version 21.1.1; however, version 21.2.4 is available.
You should consider upgrading via the 'd:\development\python\python.exe -m pip install --upgrade pip' command.
C:\Users\Administrator>
检查驱动程序
C:\Users\Administrator>python
Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
>>> pymongo.version
'3.12.0'
>>>
创建连接
from pymongo import MongoClient
uri = "mongodb://127.0.0.1:27017"
client = MongoClient(uri)
print(client)
C:\Users\Administrator>python
Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pymongo import MongoClient
>>> uri = "mongodb://127.0.0.1:27017"
>>> client = MongoClient(uri)
>>> print(client)
MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)
>>>
数据库操作
初始化数据库和集合
db = client["demo"]
user = db["user"]
插入一条数据
new_user = {"username": "test", "age": "12"}
result = user.insert(new_user)
print(result)
>>> db = client["demo"]
>>> user = db["user"]
>>> new_user = {"username": "test", "age": "12"}
>>> result = user.insert(new_user)
>>> print(result)
613329b96294f81cb1c96091
>>>
八、MongoDB聚合框架
MongoDB聚合框架(Aggregation Framework)是一个计算框架,它可以:
作用在一个或几个集合上
对集合中的数据进行的一系列运算
将这些数据转化为期望的形式
聚合框架相当于SQL查询中的:GROUP BY、 LEFT JOIN、 AS等
管道(Pipeline)和步骤(Stage)
聚合运算的基本格式
pipeline = [$stage1, $stage2, ...$stageN];
db.<COLLECTION>.aggregate(
pipeline,
{ options }
);
常见步骤
步骤 | 作用 | SQL等价运算符 |
---|---|---|
$project | 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。 | AS |
$match | 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。 | WHERE |
$limit | 用来限制MongoDB聚合管道返回的文档数。 | LIMIT |
$skip | 在聚合管道中跳过指定数量的文档,并返回余下的文档。 | SKIP |
$unwind | 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。 | |
$group | 将集合中的文档分组,可用于统计结果。 | GROUP BY |
$sort | 将输入文档排序后输出。 | ORDER BY |
$geoNear | 输出接近某一地理位置的有序文档 | |
$lookup | 左外连接 | LEFT OUTER JOIN |
$graphLookup | 图搜索 | |
$facet $bucket | 分面搜索 |
常见步骤中的运算
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : " sum : " sum:"likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : " avg : " avg:"likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : " min : " min:"likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : " max : " max:"likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : " push: " push:"url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { a d d T o S e t : " addToSet : " addToSet:"url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : { f i r s t : " first : " first:"url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : { l a s t : " last : " last:"url"}}}]) |
$match
$eq/$gt/$gte/$lt/$lte
$and/$or/$not/$in
$geoWithin/$intersect
$project
$map/$reduce/$filter
$range
$multiply/$divide/$substract/$add
$year/$month/$dayOfMonth/$hour/$minute/$second
$group
$sum/$avg
$push/$addToSet
$first/$last/$max/$min
SELECT
username AS `账户`
FROM
user
WHERE
age= 21 SKIP 5
LIMIT 10
管道操作符实例
db.user.aggregate([
{$match: {age: 21}},
{$skip: 5},
{$limit: 10},
{$project: {
'账户': '$username',
}}
]);
{ _id: ObjectId("613329f36294f81cb1c96092"), '账户': 'test' }
九、复制集的作用
MongoDB 复制集的主要意义在于实现服务高可用
它的现实依赖于两个方面的功能:
数据写入时将数据迅速复制到另一个独立节点上
在接受写入的节点发生故障时自动选举出一个新的替代节点
在实现高可用的同时,复制集实现了其他几个附加作用:
数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
读写分离:不同类型的压力分别在不同的节点上执行
异地容灾:在数据中心故障时候快速切换到异地
复制集结构
一个典型的复制集由3个以上具有投票权的节点组成,包括:
一个主节点(PRIMARY):接受写入操作和选举时投票
两个(或多个)从节点(SECONDARY):复制主节点上的新数据和选举时投票
不推荐使用 Arbiter(投票节点)
数据是如何复制的