MongoDb
Windows
重启
在 Windows 上安装 MongoDB 后,你可以按照以下步骤重启 MongoDB 服务:
使用命令提示符(适用于服务安装)
打开命令提示符:以管理员身份运行命令提示符。
停止 MongoDB 服务:
net stop MongoDB
启动 MongoDB 服务:
net start MongoDB
重启 MongoDB 服务(可以直接使用此命令代替上述两个命令, 有时候会报错无法识别 &&):
net stop MongoDB && net start MongoDB
使用 Windows 服务管理器
打开服务管理器:
按 Win + R,输入 services.msc,然后按回车。 找到 MongoDB 服务:
在服务列表中找到 MongoDB 或者 MongoDB Server。 重启服务:
右键点击 MongoDB 服务,选择 重启。或者选择 停止,然后再点击 启动。
手动启动和停止(适用于手动启动的 MongoDB)
停止 MongoDB:
打开命令提示符,执行以下命令找到并终止 MongoDB 进程:
taskkill /f /im mongod.exe
启动 MongoDB:
通过命令提示符进入 MongoDB 安装目录,然后执行以下命令:
mongod --config "C:\Program Files\MongoDB\Server\5.0\bin\mongod.cfg"
配置文件路径根据你的安装路径调整。
通过这些步骤,你可以在 Windows 上重启 MongoDB 服务。
远程连接
失败信息:mongodb远程连接出现connect ECONNREFUSED(连接被拒绝)错误的解决方法
阿里云ECS(Windows Server)
在 Windows 上安装,Mongodb 的配置文件中的 bind_ip 默认为 127.0.0.1
,默认只有本机 IP 可以连接,需要将 bind_ip
配置为:0.0.0.0
,标识接收任何 IP
的连接。默认只绑定了本机IP
配置文件地址: C:\Program Files\MongoDB\Server\7.0\bin\mongod.cfg
修改为如下图
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
先停止然后启动
net stop MongoDB
和 net start MongoDB
Windows账户A访问Windows账户B安装的数据库
使用 windwos 账户A 安装 MongoDB,切换到 windows 账户B 通过localhost:27017 来访问可能失败
这通常与文件和服务的权限设置有关。以下是详细的解决方法:
- 为账户B授予MongoDB安装目录的访问权限
- 打开 MongoDB 安装目录(通常是 C:\Program Files\MongoDB\Server<version>\)。
- 右键点击安装目录,选择“属性”。
- 转到“安全”选项卡,点击“编辑”按钮。
- 点击“添加”按钮,输入账户B的用户名,然后点击“检查名称”确认。
- 为账户B授予“读取和运行”、“列出文件夹内容”、“读取”和其他必要的权限。
- 点击“应用”并保存更改。
- 配置MongoDB服务的权限(重启即可)
- 打开“服务”窗口(按 Win + R,输入 services.msc,然后按 Enter)。
- 找到 MongoDB 服务,右键点击选择“属性”。
- 转到“登录”选项卡。
- 选择“此账户”,然后输入账户A的用户名和密码。
- 点击“应用”并重启MongoDB服务。
备注:MongoDBCompass 的安装是在账户目录下:C:\Users\XXX\AppData\Local\MongoDBCompass
MacOS
重启
macOS 上安装 MongoDB 后,使用以下命令来重启 MongoDB 服务:
- 停止 MongoDB 服务:
brew services stop mongodb
- 启动 MongoDB 服务:
brew services stop mongodb
- 重启 MongoDB 服务:
brew services stop mongodb
如果你是手动启动的 MongoDB(而不是通过 brew
服务管理),你可以使用以下命令:
- 停止 MongoDB:
sudo pkill -f mongod
- 启动 MongoDB: 进入 MongoDB 的安装目录,然后执行:
mongod --config /usr/local/etc/mongod.conf
这个命令假设你在安装时使用了默认的配置文件路径 /usr/local/etc/mongod.conf
。如果你的配置文件位于其他路径,请替换为实际的路径。
通过这些步骤,你可以成功地在 macOS 上重启 MongoDB 服务。
安全性
注意: 当开放外网访问时,数据库默认没有启动访问控制,也就是只需要IP和端口就可以访问数据库,容易被攻击!!!
仅在内网访问
正常运营环境,应该放在内网访问
大多数情况下数据库应该仅由服务器访问,它们应该在同一个内网中
mongodb://localhost:27017/
外网访问
首先必须立刻,开启访问控制,否则别人使用IP和端口就能访问你的数据库,否则设置的账号密码不起作用
- 修改
C:\Program Files\MongoDB\Server\7.0\bin\mongod.cfg
配置文件中的net
: 自定义端口,绑定所有的IPsecurity
: 启用访问控制,访问需要账号密码,且根据账户的权限才能执行相应的操作
# mongod.conf
net:
#port: 27017
port: 39363
#bindIp: 127.0.0.1
bindIp: 0.0.0.0
security:
authorization: enabled
- 启用访问控制后,就不能使用简单的
mongodb://localhost:port
进行访问了 - 具有授权信息的访问:
mongodb://admin:pwd@ip地址:端口/?authMechanism=SCRAM-SHA-1
- 启用访问控制后,备份和恢复数据库需要具有对应角色的账户才能操作,具体参照添加可以备份恢复的用户
用户管理
用户管理需要通过 Mongosh 操作,Mongosh 是嵌入到 MongoDB Compass 中的一个Javascript 运行环境,官方文档没怎么看懂
用户角色
- 创建用户时需要给用户指定角色
- 一个用户可以有多个角色,不同的角色具有不同的权限,并且会享受角色的最高权限
常用角色
分类 | 角色 | 权限 | 使用频率 |
---|---|---|---|
超级用户角色 | root | 最高权限 | 高 |
数据库用户角色 | read | 只能读链接3 | 低 |
readWrite | 可读可写,服务器使用的数据库账户 | 高 | |
数据库管理角色 | dbAdmin | 提供执行管理任务的能力,例如架构相关任务、索引和收集统计信息。该角色不授予用户和角色管理特权. | 一般 |
dbOwner | 数据库所有者可以对数据库执行任何管理操作。此角色结合了 readWrite、dbAdmin 和 userAdmin 角色授予的权限。 | 低 | |
userAdmin | 提供在当前数据库上创建和修改角色和用户的能力。由于 userAdmin 角色允许用户向任何用户(包括自己)授予任何特权,因此该角色还间接提供对数据库或(如果作用域为 admin 数据库)集群的超级用户访问权限。 | 低 | |
备份和恢复角色 | backup | 备份 | 一般 |
restore | 恢复 | 低 |
添加Root用户
添加一个超级管理员账户,此账户可以对其他管理员进行操作(注意,若要启动访问控制,在启动之前需要先添加一个超级管理员,以方便管理数据库和用户)
//root权限的
use admin
db.createUser(
{
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)
添加readWrite用户
此用户提供给服务器连接数据库
use admin
db.createUser({
user:"admin",
pwd:"tzj001",
roles:[
{role:"readWrite",db:"TSIM"}]
})
添加可以备份恢复的用户
在启用访问控制的情况下,此用户可实现对数据库进行备份和恢复
use admin
db.createUser({
user: "br",
pwd: "br123",
roles: [
{ role: "backup", db: "admin" },
{ role: "restore", db: "admin" }
]
})
备份命令
mongodump --uri="mongodb://br:br123@IP地址:端口" --out=一个文件夹
恢复命令
mongorestore --uri="mongodb://br:br123@localhost:端口/数据库名称?authMechanism=SCRAM-SHA-1&authSource=admin" --nsInclude="数据库名称.*" D:\TSIM\mongodb_backup\backup\指定还原的文件路径\TSIM
- 就按照这个格式,替换用户、密码、IP、端口、要恢复的数据库名称、恢复的文件夹路径,否则出现些奇奇怪怪的问题,如skip。。。。
- --nsInclude="数据库名称.*" 表示数据库下的所有集合,若只还原某个集合如(Users)那么写
--nsInclude="数据库名称.Users"
,多个时:--nsInclude="数据库名称.Users",--nsInclude="数据库名称.集合2"
其他操作
删除 admin
用户
db.drop("admin")
查看当前用户
db.getUsers()
或者
db.system.users.find()
或者
show users
连接字符串
当在Web程序中配置MongoDB的连接字符串,有多种方式,简单的记录两种
第一种: 连接本机上的 MongoDB ,适用于服务程序和数据库在同一个主机
"ConnectionString": "mongodb://localhost:27017/数据库名称?authSource=admin",
第二种: 连接非本机上的 MongoDB ,使用密码连接
"ConnectionString": "mongodb://userName:password@domain:27017/数据库名称?authSource=admin",
authSource=admin 说明:认证源属于管理员级别
过滤器
当使用 MongoDB C# 驱动程序进行数据查询和操作时,可以通过 Builders <T>
.Filter 构造过滤器(Filter),它们用于定义查询条件或者更新/删除操作的条件。以下是一些常用的过滤器方法及其用法解释:
Eq 方法
Eq 方法用于创建一个等于(equal)条件的过滤器。它适用于需要匹配指定字段与特定值相等的情况。
var filter = Builders<BsonDocument>.Filter.Eq("fieldName", value);
例如,如果要查询字段 "name" 等于 "Alice" 的文档,可以使用:
var filter = Builders<BsonDocument>.Filter.Eq("name", "Alice");
In 方法
In 方法用于创建一个包含于(in)条件的过滤器。它用于匹配指定字段的值在一个给定的列表或集合中的情况。
var filter = Builders<BsonDocument>.Filter.In("fieldName", values);
例如,如果要查询字段 "department" 的值在 ["IT", "HR", "Finance"] 中的文档,可以使用:
var filter = Builders<BsonDocument>.Filter.In("department", new List<string> { "IT", "HR", "Finance" });
And 方法
And 方法用于创建一个与(and)条件的过滤器,即多个条件必须同时满足。
var filter = Builders<BsonDocument>.Filter.And(
Builders<BsonDocument>.Filter.Eq("field1", value1),
Builders<BsonDocument>.Filter.Eq("field2", value2)
);
例如,如果要查询同时满足 "name" 等于 "Alice" 和 "age" 大于等于 30 的文档,可以使用:
var filter = Builders<BsonDocument>.Filter.And(
Builders<BsonDocument>.Filter.Eq("name", "Alice"),
Builders<BsonDocument>.Filter.Gte("age", 30)
);
Gte, Gt, Lte, Lt 等方法
这些方法用于创建比较条件的过滤器:
- Gte(greater than or equal):大于等于
- Gt(greater than):大于
- Lte(less than or equal):小于等于
- Lt(less than):小于
var filter = Builders<BsonDocument>.Filter.Gte("fieldName", value);
例如,如果要查询 "score" 大于等于 80 的文档,可以使用:
var filter = Builders<BsonDocument>.Filter.Gte("score", 80);
组合多种过滤器
你可以通过组合多个过滤器来构建复杂的查询条件。例如,如果要查询 "department" 是 "IT" 或者 "HR" 且 "age" 大于等于 25 的文档,可以这样组合:
var filter = Builders<BsonDocument>.Filter.And(
Builders<BsonDocument>.Filter.In("department", new List<string> { "IT", "HR" }),
);
AnyIn 方法
在 MongoDB 的 C# 驱动程序中,AnyIn 方法用于创建一个过滤器,用于检查一个数组字段中是否至少包含一个指定的值。这在需要查询数组字段中是否存在特定元素的情况下非常有用。
用法示例
假设你有一个文档结构如下:
{
"_id": ObjectId("60a9e54d95b06b84cf6e832f"),
"name": "Alice",
"interests": ["Reading", "Music", "Sports"]
}
其中,interests 是一个数组字段,包含了 Alice 的兴趣爱好。
如果你想要查询具有特定兴趣爱好的文档,例如查询兴趣包括 "Music" 或 "Sports" 的文档,可以使用 AnyIn 方法来构建过滤器:
var filter = Builders<BsonDocument>.Filter.AnyIn("interests", new BsonArray { "Music", "Sports" });
解释
Builders <BsonDocument>
.Filter.AnyIn 方法用于创建一个数组字段的过滤器,该方法接受两个参数:
第一个参数是字段名 "interests",这是你要进行过滤的数组字段。
第二个参数是一个 BsonArray,其中包含了要匹配的值的列表。在上面的例子中,我们使用了 new BsonArray { "Music", "Sports" } 来表示我们要查询包含 "Music" 或 "Sports" 的兴趣爱好的文档。
注意事项
AnyIn 方法是针对数组字段进行查询的一种特定方式。它只匹配数组中至少包含一个指定值的文档。如果数组字段中同时包含了多个指定值,文档也会被匹配。 在实际应用中,可以根据具体的业务需求和数据结构来灵活使用 AnyIn 方法,从而实现复杂的查询操作。 以上是关于 AnyIn 方法在 MongoDB C# 驱动程序中的基本用法和示例解释。
总结
以上是一些常见的 MongoDB C# 驱动程序中过滤器方法的用法。它们可以帮助你构建灵活且强大的查询条件,以满足各种数据查询、更新和删除的需求。在实际应用中,根据具体的业务需求和数据结构,你可以灵活地组合这些方法来实现复杂的数据操作。
事务
// For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.
// string uri = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl";
// For a sharded cluster, connect to the mongos instances; e.g.
// string uri = "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/";
var client = new MongoClient(connectionString);
// Prereq: Create collections.
var database1 = client.GetDatabase("mydb1");
var collection1 = database1.GetCollection<BsonDocument>("foo").WithWriteConcern(WriteConcern.WMajority);
collection1.InsertOne(new BsonDocument("abc", 0));
var database2 = client.GetDatabase("mydb2");
var collection2 = database2.GetCollection<BsonDocument>("bar").WithWriteConcern(WriteConcern.WMajority);
collection2.InsertOne(new BsonDocument("xyz", 0));
// Step 1: Start a client session.
using (var session = client.StartSession())
{
// Step 2: Optional. Define options to use for the transaction.
var transactionOptions = new TransactionOptions(
writeConcern: WriteConcern.WMajority);
// Step 3: Define the sequence of operations to perform inside the transactions
var cancellationToken = CancellationToken.None; // normally a real token would be used
result = session.WithTransaction(
(s, ct) =>
{
collection1.InsertOne(s, new BsonDocument("abc", 1), cancellationToken: ct);
collection2.InsertOne(s, new BsonDocument("xyz", 999), cancellationToken: ct);
return "Inserted into collections in different databases";
},
transactionOptions,
cancellationToken);
}
Bson序列化特性
BsonIgnoreExtraElements
类特性描述:反序列化时用来忽略多余的字段,一般版本兼容需要考虑,低版本的协议需要能够反序列化高版本的内容,否则新版本删除字段,旧版本结构反序列化会出错
使用情况
- 新版本中将某个属性或字段删除
- 新版本中给某个属性或字段添加
BsonIgnore
特性
注意,若在基类中定义的属性,也需要在子类中添加此特性才有效!
时区
原因1: MongoDB自带的Date是UTC的时间,中国是东八区,所以差了8个小时。
解决方法: 在mongodb可视化工具Robomongo中,我们可以通过"Options" - “Display Dates in…” - "Local Timezone"来设置显示本地时间。
原因2: MongoDB中存储的时间是标准时间 UTC +0:00
解决方法: C#的驱动支持一个特性,将实体的时间属性上添加上这个特性并指时区就可以了。
例如:
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime CreateTime{get;set;}
数据库迁移
Windows 环境 工具:Cmd、PowerShell
将 MongoDB 数据库迁移到另一台服务器或集群通常涉及以下几个步骤:
- 安装 Mongodb 数据库工具
- 备份现有数据库
- 将备份文件传输到目标服务器
- 在目标服务器上恢复备份
具体步骤如下:
安装 MongoDB 数据库工具
注意:我们安装 Mongodb 数据库时,并没有附带安装 mongodb 的命令行工具,需要另外下载
1. 下载工具
- 访问 MongoDB Command Line Database Tools Download
- 选择适用于你的操作系统(Windows)的安装包进行下载。
2. 安装工具
下载完成后,解压缩安装包并将其内容放置在你希望安装的目录中,例如 C:\mongodb-database-tools。
3. 配置环境变量
为了在命令提示符中使用 mongodump
和 mongorestore
命令,需要将 MongoDB 数据库工具的安装路径添加到系统的 PATH 环境变量中:
- 右键单击“此电脑”或“计算机”图标,然后选择“属性”。
- 在左侧菜单中选择“高级系统设置”。
- 在“系统属性”窗口中,点击“环境变量”按钮。
- 在“系统变量”部分找到并选择 Path 变量,然后点击“编辑”。
- 在“编辑环境变量”窗口中,点击“新建”,并输入 MongoDB 数据库工具的安装路径,例如
C:\mongodb-database-tools\bin
。 - 点击“确定”保存更改。
4. 重启命令提示符:
关闭所有打开的命令提示符窗口,然后重新打开一个新的命令提示符窗口,以确保更改生效。
5. 验证安装
打开新的命令提示符窗口,输入以下命令以验证 mongodump 是否可用:
mongodump --version
如果命令输出了版本信息,则说明安装和配置成功,现在,可以使用 mongodump 和 mongorestore 命令来备份和恢复 MongoDB 数据库。
备份现有数据库
你可以使用 mongodump 工具来创建数据库的备份。以下是命令示例:
mongodump --uri="mongodb://username:password@source_host:port/dbname" --out=/path/to/backup
这个命令会把 dbname 数据库的所有数据导出到指定路径 /path/to/backup。
定时备份
☀️最好创建定时任务,定时备份数据,避免数据丢失。
一、创建定时任务脚本,示例:
@echo off
:: 处理时间的小时数为个位数时,出现空格问题。使用0补位
set t=%time:~0,2%%time:~3,2%%time:~6,2%
set t=%t: =0%
:: 定义备份目录(可以根据需要更改)
set backupDir=C:\TZJ\TSIM\mongodb_backup\backup\%date:~0,4%-%date:~5,2%-%date:~8,2%-%t%
:: 创建备份目录
if not exist %backupDir% (
mkdir %backupDir%
)
:: 备份 MongoDB 数据库(修改为实际的数据库和路径)
mongodump --uri="mongodb://localhost:27017/TSIM" --out=%backupDir%
:: 输出备份完成信息
echo Backup completed at %date% %time%
⚠️ 脚本注意事项
- 需要处理当小时数小于10时出现空格,需要补位0
- 脚本中不要出现
pause
,否则在计划中,当前实例会一直存在,导致后续无法创建新实例(在设置中默认配置“请勿创建新实例”),即使设置了可以并行运行,那也会无限制的创建新实例,资源浪费。
二、配置 Windows 任务计划程序
通过 Windows 任务计划程序来定时执行上面的备份脚本。
步骤:
- 打开任务计划程序:按下 Win + S,搜索“任务计划程序”并打开。
- 创建基本任务:
- 在任务计划程序窗口中,点击右侧的“创建基本任务”。
- 为任务命名,例如“MongoDB 定时备份”。
- 选择触发器,例如每日、每周、每月等。比如选择“每日”。
- 设置时间,选择希望执行任务的时间。
- 设置操作:
- 在“操作”步骤,选择“启动程序”。
- 浏览并选择上一步中创建的批处理文件 (例如 backup_mongo.bat)。
- 完成任务:点击完成,任务将自动按照设置的计划执行。
三、验证任务
完成后可以手动运行任务以验证是否正常工作。在任务计划程序中,右键点击任务,选择“运行”,查看备份文件是否生成。
将备份文件传输到目标服务器
你可以使用 scp 命令(对于 Linux)或其他文件传输工具(如 SFTP、FTP 等)将备份文件传输到目标服务器:
Windows
通过远程桌面直接拷贝即可。
Linux
scp -r /path/to/backup user@target_host:/path/to/destination
在目标服务器上恢复备份
在目标服务器上使用 mongorestore 工具来恢复备份的数据:
mongorestore --uri="mongodb://username:password@target_host:port/dbname" /path/to/destination/backup
启用了访问控制处理
异常处理
SASL(Simple Authentication and Security Layer)错误通常与身份验证和安全相关,特别是在连接到 MongoDB 时使用用户名和密码进行身份验证时。为了排查和解决这个问题,请按照以下步骤操作:
1. 检查连接字符串
确保你的连接字符串格式正确,包括用户名、密码、主机和端口,例如:
mongodb://username:password@source_host:port/dbname
2. 使用 URI 编码特殊字符
如果用户名或密码中包含特殊字符(如 @, :, # 等),需要对这些字符进行 URI 编码。你可以使用 URL编码在线工具 来对特殊字符进行编码,常见的有:
@ 编码为 %40
: 编码为 %3A
# 编码为 %23
% 编码为 %25
例如,如果密码是 pa@ss:word#123,则连接字符串应为:
mongodb://username:pa%40ss%3Aword%23123@source_host:port/dbname
3. 使用 --authenticationDatabase 选项
如果用户名和密码属于 admin 数据库(或其他非目标数据库),需要指定 --authenticationDatabase 选项。例如:
备份数据库:
mongodump --uri="mongodb://username:password@source_host:27017/dbname"
--authenticationDatabase="admin" --out="C:\path\to\backup"
恢复数据库:
mongorestore --uri="mongodb://username:password@target_host:27017/dbname" --authenticationDatabase="
4. 启用 SCRAM-SHA-1 或 SCRAM-SHA-256
MongoDB 3.0 及以上版本默认使用 SCRAM-SHA-1 进行身份验证,MongoDB 4.0 及以上版本默认使用 SCRAM-SHA-256。如果你的 MongoDB 服务器配置了不同的身份验证机制,需要确保客户端也支持该机制。
其他注意事项
确保版本兼容性:确保源 MongoDB 服务器和目标 MongoDB 服务器的版本兼容。如果版本差异过大,可能需要进行数据格式的转换。
网络带宽和速度: 考虑到数据传输的时间和速度,特别是对于大数据量的情况下,可能需要更长的时间。
安全性:在传输敏感数据时,请确保使用安全的传输协议和方法。
使用 MongoDB Atlas
如果你使用的是 MongoDB Atlas,MongoDB 官方提供了一些迁移工具,如 mongomirror,可以帮助你将自托管的 MongoDB 数据库迁移到 Atlas 上。这些工具可以实现实时数据同步和迁移。
在线迁移
如果你需要在迁移过程中保持数据库的高可用性,可以考虑使用 MongoDB 的副本集(replica set)来进行无缝迁移。这个方法更为复杂,但可以确保在迁移过程中数据的持续可用。