【发布时间】:2011-11-27 16:21:28
【问题描述】:
我正在用 C 语言为 MongoDB 编写一个 GUI 客户端。我使用 C driver for MongoDB。我想获取数据库及其集合的列表,但我在documentation 中找不到任何函数来执行此操作。
如何使用 C 驱动程序获取数据库和集合的列表?
【问题讨论】:
我正在用 C 语言为 MongoDB 编写一个 GUI 客户端。我使用 C driver for MongoDB。我想获取数据库及其集合的列表,但我在documentation 中找不到任何函数来执行此操作。
如何使用 C 驱动程序获取数据库和集合的列表?
【问题讨论】:
这里的其他答案似乎完成了一半,甚至与 C/C++ 接口无关。看了很多之后,这对我有用:
string serverHost("127.0.0.1:27017");
mongo::DBClientConnection conn;
string errmsg;
if( conn.connect( serverHost, errmsg ) )
{
BSONObj cmd = mongo::fromjson( "{listDatabases: 1}" );
BSONObj info;
if( conn.runCommand( "admin", cmd, info ) )
{
BSONElement arrayel = info.getField("databases");
std::vector<BSONElement> mdArray = arrayel.Array();
std::vector<BSONElement>::iterator iter;
for( iter=mdArray.begin(); iter!=mdArray.end(); ++iter )
{
BSONElement element = *iter;
BSONObj obj = element.Obj();
// HERE IS THE DATABASE NAME
string dbname = obj.getStringField("name");
// HERE IS THE LIST OF COLLECTIONS, BUT MAY NEED TO IGNORE ONE
// TITLED "system.indexes"
list<string> collNamespaces =
conn.getCollectionNames(dbname);
list<string>::iterator iter2 = collNamespaces.begin();
while( iter2 != collNamespaces.end() )
{
// EACH ENTRY HAS THE FULL NAMESPACE ("database:collection").
// Use this method to strip off the database name
string collectionName = mongo::nsGetCollection(*iter2);
++iter2;
} // END WHILE iterate through collections
} // END WHILE iterate through databases
} // END IF runCommand() returned success
} // END IF database connected
【讨论】:
我认为您必须使用mongo_run_command(mongo *conn, const char * db, bson *command, bson *out),其中您的command 是BSON 命令。您应该能够使用定义here 的命令。请注意,某些命令要求它们在数据库admin 上发出。因此,在 mongodb shell 中,可以像这样查询数据库列表:
> use admin
switched to db admin
> db.runCommand({listDatabases: 1})
{
"databases" : [
{
"name" : "geo",
"sizeOnDisk" : 14975762432,
"empty" : false
},
{
"name" : "local",
"sizeOnDisk" : 1,
"empty" : true
}
],
"totalSize" : 14975762432,
"ok" : 1
}
使用此操作的结果,您可以查询每个数据库的可用集合。上面使用C接口的我没有尝试过,但是我相信你应该可以通过调用mongo_run_command并传递适当的参数来实现。
【讨论】:
要获取数据库中的所有集合名称,您可以使用mongoc_database_get_collection_names
bson_error_t error;
char **strv;
unsigned i;
if((strv = mongoc_database_get_collection_names (database, &error)))
{
for(i = 0; strv [i]; i++)
printf ("%s\n", strv [i]);
bson_strfreev (strv);
}
else
{
fprintf(stderr, "Command failed: %s\n", error.message);
}
【讨论】:
Matlab 驱动程序提供了两个函数:mongo_get_databases() 和:mongo_get_database_collections()(下面的示例代码 sn-p),它们似乎提供了您的功能要求:
EXPORT mxArray* mongo_get_databases(struct mongo_* conn) {
bson out;
mxArray* ret;
int count = 0;
bson_iterator it, databases, database;
int i = 0;
if (mongo_simple_int_command((mongo*)conn, "admin", "listDatabases", 1, &out) != MONGO_OK) {
bson_destroy(&out);
return 0;
}
bson_iterator_init(&it, &out);
...
bson_destroy(&out);
return ret;
}
【讨论】: