我当前使用下面的命令行运行 MongoDB,指向相应的数据目录:
mongod --dbpath "somePath/data"
但目前这是我在运行特定测试套件之前运行的手动步骤。有没有办法使用 Mongo C# 驱动程序在代码中设置路径(无需调用脚本或批处理文件)以使用特定的数据目录?
更新:
澄清一下,我这样做的原因不是为了在生产代码中使用,而是为了隔离不同测试套件的测试数据库并指向一次性且隔离的数据目录,以便每个服务器实例都是干净的在运行测试时,仅填充与生产相同的服务器设置所需的数据。
最佳答案
您可能找不到任何方法来做到这一点。 Mongo C# 驱动程序用于编写 MongoClient,而不是服务器。 C# Driver for MongoDB 的文档说 - MongoClient 类充当使用 MongoDB 服务器的根对象
。当您对客户端进行编程时,您会自动假设服务器已启动并正在运行。无论您手动执行还是为其编写其他代码,那都是不同的故事。
您很少会允许人们连接到计算机并让他们在其上启动服务器和客户端。为什么很少见?您可能会尝试在另一台计算机上启动服务器,但会搞砸该计算机(该计算机也可能提供其他一些完全不同的服务!)。有一些方法(有时需要)远程启动服务器,但这不是您可以使用 MongoDB C# 驱动程序执行的操作。
现在,为了完成您的任务,您可以尝试以下操作:
在服务器上为每个数据库启动一个 mongod,并让每个 mongod 监听不同的端口。然后在您的代码中,您可以将 MongoClient 连接到在相关数据库端口上运行的 mongod。您可以通过使用简单的 if 条件(或 switch case)并检查 MongoClient 想要连接到哪个数据库来实现此目的,从而找到要放入连接字符串中的正确端口值。每个 mongod 只能服务一个或多个数据库或任何您想要的数据库。
因此,如果您在 port1、port2 和 port3 上运行三个 mongod
,并且所有这三个都连接到各自的数据库路径,则代码可能有点像这样:
var DBNAME = name_of_the_db;
string connectionString;
switch (DBNAME)
{
case name_of_first_DB:
connectionString = "mongodb://[user:pass@]hostname[:port1][/[DBNAME][?options]]";
break;
case name_of_second_DB:
connectionString = "mongodb://[user:pass@]hostname[:port2][/[DBNAME][?options]]";
break;
case name_of_third_DB:
connectionString = "mongodb://[user:pass@]hostname[:port3][/[DBNAME][?options]]";
break;
default:
Console.WriteLine("Invalid DB Name");
}
回答问题的更新部分: 您可以在服务器的不同分区上启动 mongod。甚至从不同的驱动器启动守护进程并让它们监听不同的端口。不用说,dbpath 不应指向任何两个数据库的同一驱动器,以至少非常接近地模仿您想要的内容。
为了完成这个答案,我添加了 @Schaliasos 在评论中提到的内容。考虑 installing mongo as a window service .
关于c# - 如何使用 C# 驱动程序设置 MongoDB 的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066625/