【发布时间】:2011-08-13 09:50:04
【问题描述】:
是否有可能检查一个 mongo 数据库是否已经存在?
【问题讨论】:
-
您使用什么语言/驱动程序?
是否有可能检查一个 mongo 数据库是否已经存在?
【问题讨论】:
是的,您可以获得现有数据库的列表。从 Java 驱动程序中,您可以执行类似的操作来获取运行在本地主机上的 mongod 服务器上的数据库名称
Mongo mongo = new Mongo( "127.0.0.1", 27017 );
List<String> databaseNames = mongo.getDatabaseNames();
这相当于 mongo shell “show dbs” 命令。我确信所有驱动程序中都存在类似的方法。
【讨论】:
如果您想从 shell 中明确检查数据库是否存在:
db.getMongo().getDBNames().indexOf("mydb");
如果“mydb”不存在,将返回“-1”。
要在 shell 中使用它:
if [ $(mongo localhost:27017 --eval 'db.getMongo().getDBNames().indexOf("mydb")' --quiet) -lt 0 ]; then
echo "mydb does not exist"
else
echo "mydb exists"
fi
【讨论】:
对于因为getDatabaseNames(); 方法已被贬值/不可用而来到这里的任何人,这里是获取现有数据库列表的新方法:
MongoClient mongoClient = new MongoClient();
MongoCursor<String> dbsCursor = mongoClient.listDatabaseNames().iterator();
while(dbsCursor.hasNext()) {
System.out.println(dbsCursor.next());
}
这是一个验证是否找到数据库的方法:
public Boolean databaseFound(String databaseName){
MongoClient mongoClient = new MongoClient(); //Maybe replace it with an already existing client
MongoCursor<String> dbsCursor = mongoClient.listDatabaseNames().iterator();
while(dbsCursor.hasNext()) {
if(dbsCursor.next().equals(databaseName))
return true;
}
return false;
}
【讨论】:
在 python 中使用 Pymongo
from pymongo import MongoClient
db_name = "foo"
conn = MongoClient('mongodb://localhost,localhost:27017')
db = self.conn[str(db_name)]
if bool(db_name in conn.database_names()):
collection.drop()
【讨论】:
使用 MongoDb c# Driver 2.4
private bool DatabaseExists(string database)
{
// _client is IMongoClient
var dbList = _client.ListDatabases().ToList().Select(db => db.GetValue("name").AsString);
return dbList.Contains(database);
}
用法:
if (!DatabaseExists("FooDb")
{
// create and seed db
}
【讨论】:
我想添加一个 C# 版本。我正在使用 MongoDB.Driver 2.2.2。
static bool DatabaseExists(string connectionString)
{
var mongoUri = new MongoUrl(connectionString);
var client = new MongoClient(mongoUri);
var dbList = Enumerate(client.ListDatabases()).Select(db => db.GetValue("name").AsString);
return dbList.Contains(mongoUri.DatabaseName);
}
static IEnumerable<BsonDocument> Enumerate(IAsyncCursor<BsonDocument> docs)
{
while (docs.MoveNext())
{
foreach (var item in docs.Current)
{
yield return item;
}
}
}
【讨论】:
试试这个,它对我有用(在 Mac OSx 上)
MongoClient mongoClient = new MongoClient("localhost");
/** **/
boolean dbExist =
mongoClient.listDatabaseNames().
into(new ArrayList<String>()).contains("TEST");
System.out.print(dbExist);
【讨论】:
上面的 PyMongo 示例对我不起作用,因此我使用更标准的 list_databases() 方法将其重写为 MongoClient 库:
from pymongo import MongoClient
db_name = "foo"
conn = MongoClient('mongodb://localhost,localhost:27017')
if bool(db_name in conn.list_databases()):
print true # or return true here
else:
print false # or return false here
【讨论】:
在我的例子中,我不能使用listDatabaseNames,因为我的用户没有权限调用这个函数。相反,我只是假设它存在并调用此数据库上的一个方法,如果它不存在或缺少权限,则该方法将失败。
演示 C# 代码:
/// <summary>
/// Tests the connection to the MongoDB server, and if the database already exists.
/// If not or an error is detected, an exception is thrown.
/// </summary>
public static void TestConnection(string mongoUrl, string mongoDatabase) {
var client = new MongoClient(mongoUrl);
var database = client.GetDatabase(mongoDatabase);
try {
// Try to perform an action on this database; will fail if it does not exist
database.ListCollections();
}
catch {
throw new Exception("Connection established, " +
"but database does not exist (or missing rights): " + mongoDatabase);
}
}
【讨论】: