【问题标题】:How can I get a list of databases and collections on a MongoDB server?如何获取 MongoDB 服务器上的数据库和集合列表?
【发布时间】:2011-11-27 16:21:28
【问题描述】:

我正在用 C 语言为 MongoDB 编写一个 GUI 客户端。我使用 C driver for MongoDB。我想获取数据库及其集合的列表,但我在documentation 中找不到任何函数来执行此操作。

如何使用 C 驱动程序获取数据库和集合的列表?

【问题讨论】:

    标签: c mongodb


    【解决方案1】:

    这里的其他答案似乎完成了一半,甚至与 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
    

    【讨论】:

      【解决方案2】:

      我认为您必须使用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并传递适当的参数来实现。

      【讨论】:

      • 对于数据库中的集合列表,使用“use dbname”切换到数据库,然后运行db.getCollectionNames()。
      【解决方案3】:

      要获取数据库中的所有集合名称,您可以使用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);
      }
      

      【讨论】:

        【解决方案4】:

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 2019-01-13
          • 2020-04-18
          • 2011-07-05
          • 2014-09-06
          • 2020-12-26
          • 2023-02-02
          • 1970-01-01
          • 2021-07-05
          • 1970-01-01
          相关资源
          最近更新 更多