C 如何获取MongoDB服务器上的数据库和集合列表?

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语言为MongoDB编写一个GUI客户端。我想获取数据库及其集合的列表,但在中找不到任何函数来执行此操作


如何使用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()。