C 如何获取MongoDB服务器上的数据库和集合列表?
我正在用C语言为MongoDB编写一个GUI客户端。我想获取数据库及其集合的列表,但在中找不到任何函数来执行此操作C 如何获取MongoDB服务器上的数据库和集合列表?,c,mongodb,C,Mongodb,我正在用C语言为MongoDB编写一个GUI客户端。我想获取数据库及其集合的列表,但在中找不到任何函数来执行此操作 如何使用C驱动程序获取数据库和集合的列表?我认为您必须使用mongo\u run\u命令(mongo*conn,const char*db,bson*命令,bson*out)其中命令是bson命令。您应该能够使用定义的命令。请注意,有些命令需要在数据库admin上发出。因此,在mongodb shell中,可以查询如下数据库列表: > use admin switched t
如何使用C驱动程序获取数据库和集合的列表?我认为您必须使用
mongo\u run\u命令(mongo*conn,const char*db,bson*命令,bson*out)
其中命令是bson命令。您应该能够使用定义的命令。请注意,有些命令需要在数据库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\u run\u命令并传递适当的参数,您应该能够实现同样的效果。驱动程序提供两个功能:mongo\u get\u databases()和:mongo\u get\u database\u collections()(下面的示例代码片段),似乎提供了您要求的功能:
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;
}
这里的其他答案似乎有一半是完整的,甚至与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
stringserverhost(“127.0.0.1:27017”);
mongo::DBClientConnection-conn;
字符串errmsg;
if(conn.connect(serverHost,errmsg))
{
bsonobjcmd=mongo::fromjson(“{listDatabases:1}”);
BSONObj信息;
if(conn.runCommand(“admin”、cmd、info))
{
BSONElement arrayel=info.getField(“数据库”);
std::vector mdArray=arrayel.Array();
std::vector::iter;
对于(iter=mdArray.begin();iter!=mdArray.end();++iter)
{
b单一元素=*iter;
BSONObj=element.obj();
//这是数据库名
string dbname=obj.getStringField(“名称”);
//以下是集合列表,但可能需要忽略其中一个
//标题为“系统索引”
列表名称空间=
conn.getCollectionNames(dbname);
列表::迭代器iter2=collNamespaces.begin();
while(iter2!=collNamespaces.end())
{
//每个条目都有完整的名称空间(“数据库:集合”)。
//使用此方法删除数据库名称
字符串collectionName=mongo::nsGetCollection(*iter2);
++iter2;
}//遍历集合时结束
}//在遍历数据库时结束
}//如果runCommand()返回成功,则结束
}//如果数据库已连接,则结束
要获取数据库中的所有集合名称,可以使用mongoc\u数据库\u获取\u集合\u名称
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);
}
对于数据库中的集合列表,请切换到具有“use dbname”的数据库,然后运行db.getCollectionNames()。