我目前使用以下命令行运行指向相应数据目录的MongoDB:
mongod --dbpath "somePath/data"
但是目前这是我在运行特定测试套件之前运行的手动步骤。有没有办法可以使用Mongo C#驱动程序在代码中设置路径(不调用脚本或批处理文件)来使用特定的数据目录?
更新:
为了澄清,我希望这样做的原因不是用于生产代码,而是用于隔离不同测试套件的测试数据库,并指向一次性和隔离的数据目录,以便每个服务器实例都是干净的在运行测试时,仅使用与生产相同的服务器设置所需的数据填充。
答案 0 :(得分:2)
你可能找不到任何办法。 Mongo C#Driver用于编程MongoClient,而不是服务器。 MongoDB的C#Driver文档说明了 - MongoClient class serves as the root object for working with a MongoDB server
。在编写客户端时,您会自动认为服务器已启动并正在运行。无论您是手动执行还是为其编写其他代码,都是一个不同的故事。
您很少允许人们连接到计算机并让他们启动服务器和客户端。为什么它很少见?您可以尝试在另一台计算机上启动服务器 并搞砸该计算机(也可能提供其他一些完全不同的服务!)。有一些方法(有时需要它)远程启动服务器,但这不是使用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。