我想使用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,但不确定......
答案 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] );
}
另外,请考虑使用strncpy
和strncat
以及最大值 - 如果名称字段长度为300个字符,则此处会出现一些意外行为。
答案 2 :(得分:0)
如果我有足够的信誉点,我会在@jacobra的answer上添加此注释,以使代码正常工作:
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);
}
}
有用的链接: