从MongoDB _id转换为C中的字符串

时间:2012-07-12 23:47:22

标签: c mongodb

我想使用mongodb _id属性来保证名称的唯一性。

mongo_cursor_init( cursor, &conn, &database );
bson_iterator iterator[1];

bson_find( iterator, mongo_cursor_bson( cursor ), "name" );
const char *filename = bson_iterator_string( iterator );

bson_find( iterator, mongo_cursor_bson( cursor ), "_id" );
const char *mongoid = bson_iterator_string(iterator);

char name[255];
strcpy(name,filename);
strcat(name,".");
strcat(name,mongoid);

但是,变量mongoid没有正确填充(根本没有......)。我不知道如何找到_id的数据类型。有没有人这样做过?谢谢!

编辑:我认为答案在here,但不确定......

3 个答案:

答案 0 :(得分:3)

希望这有助于某人...

Mongo _id to string:

char mongoid[25];
bson_find( iterator, mongo_cursor_bson( cursor ), "_id" );
bson_oid_t *oid = bson_iterator_oid( iterator );
bson_oid_to_string(oid,mongoid);

字符串到Mongo _id:

bson_oid_t new_oid;
bson_oid_from_string(&new_oid,mongoid);

答案 1 :(得分:1)

你想要bson_iterator_oid() - oid用于ObjectId。

您可以从中获取字节数,并使用类似(未经测试)的循环将它们转换为十六进制:

bson_find( iterator, mongo_cursor_bson( cursor ), "_id" );
bson_oid_t *oid = bson_iterator_oid( iterator );

char mongoid[25];
for(int i = 0; i < 12; i++)
{
  snprintf( mongoid, 2, "%02X", oid->bytes[i] );
}

另外,请考虑使用strncpystrncat以及最大值 - 如果名称字段长度为300个字符,则此处会出现一些意外行为。

答案 2 :(得分:0)

如果我有足够的信誉点,我会在@jacobraanswer上添加此注释,以使代码正常工作:

char mongoid[25];
bson_find( iterator, mongo_cursor_bson( cursor ), "_id" ); // not sure if this function actually exists or the user referred to bson_iter_find
const bson_oid_t *oid = bson_iterator_oid( iterator );
bson_oid_to_string(oid,mongoid);

只需在 bson_oid_t *oid = bson_iterator_oid( iterator );之前添加const关键字

值得一提的是,我无法找到函数“ bson_find”,并且可以使用类似这样的东西:

bson_iter_t         Iterator; // to loop over the bson document 
if (!bson_iter_init(&Iterator, Document.GetDocumentStr())) // your document
        return;
while (bson_iter_next(&Iterator)) {
if (BSON_ITER_HOLDS_OID(&Iterator) && strcmp(Key, "_id") == 0)
// our key is the _id
        {       
            const bson_oid_t *oid = bson_iter_oid(&Iterator);
            bson_oid_to_string(oid, Data.Id);
        }
}

有用的链接: