使用C驱动程序查询Mongodb键和值

时间:2013-12-17 08:25:30

标签: mongodb mongodb-query bson

mongo_cursor *cursor=mongo_find(conn,TEST_NS,query,NULL,0,0,0);

  count_matched=0;    
  bson *doc;

  while(mongo_cursor_next(cursor)==MONGO_OK)
  {   
      count_matched++;

      doc=(bson *)mongo_cursor_bson(cursor);
      bson_iterator_init(&it,doc);

   while(bson_iterator_next(&it) != BSON_EOO)
   {
       fprintf(stderr,"%s : %s\n\n",bson_iterator_key(&it),bson_iterator_string(&it));

   }
  }

此代码工作正常,我可以看到匹配的文档(Key + Value),但现在我想将匹配文档的键和值保存到字符串中。可以告诉我如何将键和值的返回值保存到字符串中吗?

一个文件包括(所有字符串)

Total Key=10
Total value=10

我希望一次保存10个文档的密钥和值。我正在使用mongodb的C驱动程序。

2 个答案:

答案 0 :(得分:1)

以下代码显示了如何将bson迭代器中的键和值复制到键值数组temp_key和temp_value中。特定的代码块位于标记为START和END的注释之间。

此外,您可以在http://api.mongodb.org/c/current/bson.html找到有关访问BSON文档内容的文档。

mongo_cursor *cursor = mongo_find(&conn, TEST_NS, &query, NULL, 0, 0, 0);
int count_matched = 0;
bson *doc;

// Assuming you are just looking for 100 key / value pair of max length of 99 characters
const unsigned KV_ARRAY_LENGTH = 100;
const unsigned MAX_KV_LENGTH = 105;
char temp_key[KV_ARRAY_LENGTH][MAX_KV_LENGTH + 1], temp_value[KV_ARRAY_LENGTH][MAX_KV_LENGTH + 1];
int i = 0;
while (mongo_cursor_next(cursor) == MONGO_OK) {
    count_matched++;
    doc=(bson *)mongo_cursor_bson(cursor);

    bson_iterator it;
    bson_iterator_init(&it,doc);

    while (bson_iterator_next(&it) != BSON_EOO) {
        fprintf(stderr,"%s : %s\n", bson_iterator_key(&it), bson_iterator_string(&it));

        /******* START - Code to capture key-value into appropriate array */
        if (i < KV_ARRAY_LENGTH) {
            /* - Collect key-value pairs only if there is space in the array 
             * - Key / Value woud be captured only till the max amount of space available for them i.e. MAX_KV_LENGTH in this case
             * */
            strncpy(temp_key[i], bson_iterator_key(&it), MAX_KV_LENGTH);
            strncpy(temp_value[i], bson_iterator_string(&it), MAX_KV_LENGTH);
            temp_key[i][MAX_KV_LENGTH] = temp_value[i][MAX_KV_LENGTH] = '\0';
            ++i;
        } else {
            /* whatever need to be done if there is no room in the array */
        }
        /******* END - Code to capture key-value into appropriate array */
    }
}

/* Test iterating through the key-value pair constructed in query iteration */
fprintf(stdout, "--- Fields collected ---\n");
int keyIndex = 0;
for ( ; keyIndex < i; ++keyIndex) {
    fprintf(stdout, "{key: %s, value: %s}\n", temp_key[keyIndex], temp_value[keyIndex]);
}

答案 1 :(得分:0)

mongo_cursor *cursor=mongo_find(conn,TEST_NS,query,NULL,0,0,0);

  count_matched=0;    
  bson *doc;

  //Answer
  const char* temp_key[100][100],temp_value[100][100];
  int i=0;
  while(mongo_cursor_next(cursor)==MONGO_OK)
  {   
      count_matched++;

      doc=(bson *)mongo_cursor_bson(cursor);
      bson_iterator_init(&it,doc);

   while(bson_iterator_next(&it) != BSON_EOO)
   {
       fprintf(stderr,"%s : %s\n\n",bson_iterator_key(&it),bson_iterator_string(&it));
       temp[i][0]=bson_iterator_key[&it]; //Answer
       temp_value[i][0]=bson_iterator_key[&it]; //Answer
       i++;  //Answer
   }

  }

只是为了记录,这是粗略的草图,我知道临时变量及其溢出的损坏,但我将根据我的代码将其删除。