检查MongoDB数据库是否存在?

18

有没有可能检查Mongo数据库是否已经存在?


4
你正在使用什么语言/驱动程序? - dcrosta
11个回答

17

是的,你可以获取现有数据库的列表。从Java驱动程序中,你可以像这样获取运行在本地主机上的mongod服务器上的数据库名称

Mongo mongo = new Mongo( "127.0.0.1", 27017 );
List<String> databaseNames = mongo.getDatabaseNames();

这相当于Mongo shell的"show dbs"命令。我确信所有的驱动程序都存在类似的方法。


2
由于某种奇怪的原因,当我使用以下代码时:MongoDatabase database = mongoClient.getDatabase("NAMEDB"); 如果 (database == null) {...} 我得到的结果是数据库不为NULL,但实际上并不存在名为'NAMEDB'的数据库。如果我检查database.getName(),我会得到结果'NAMEDB',但是'NAMEDB'并不存在。 - Domenico Monaco

16

如果你想要从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

5

如果有人因为方法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;
}

给任何版主:这个答案的版本是直接针对问题量身定制的。 - Cydrick Trudel
Java中的Ref http://api.mongodb.org/java/current/com/mongodb/Mongo.html#getDatabaseNames-- - c24b

2
使用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

        }

2

使用Pymongo在Python中

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()

1

我想添加一个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;
        }
    }
}

0

上面的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 # 或在此处返回true else: print false # 或在此处返回false


0

你可以试试这个方法,它在我的Mac OSx上可行。

MongoClient mongoClient = new MongoClient("localhost");
/** **/
boolean dbExist =
    mongoClient.listDatabaseNames().
    into(new ArrayList<String>()).contains("TEST");

System.out.print(dbExist);

0

我在搜索如何在golang中列出数据库名称时偶然发现了这个页面。看起来没有人提供检查特定数据库名称是否存在的方法。

假设您正在使用MongoDB Go Driver,这里是一种方法

// client type is *mongo.Client
dbNames, err := client.ListDatabaseNames(context.Background(), bson.D{{Key: "name", Value: "YOUR-DB-NAME"}})

"dbNames" 包含了 MongoDB 服务器中所有数据库的列表。 第二个参数是一个过滤器,在这种情况下,它只允许名称为 "YOUR-DB-NAME" 的数据库。因此,如果 "YOUR-DB-NAME" 不存在,那么 dbNames 将为空。


0
在我的情况下,我无法使用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);
   }    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接