1

我想使用 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 的数据类型。有没有人这样做过?谢谢!

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

4

3 回答 3

4

希望这可以帮助某人...

Mongo _id 到字符串:

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);
于 2012-07-16T21:56:51.580 回答
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] );
}

此外,请考虑使用strncpyandstrncat具有合理的最大值——如果名称字段的长度为 300 个字符,那么您将在此处遇到一些意外行为。

于 2012-07-13T06:51:54.500 回答
0

如果我有足够的声誉点,我会在@jacobra答案中添加此评论以使代码正常工作:

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

之前刚加了 const 关键字 bson_oid_t *oid = bson_iterator_oid( iterator );

还值得一提的是,我还没有找到函数“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);
        }
}

有用的链接:

于 2020-09-03T13:59:32.260 回答