如何获取mongoc_collection_insert_one插入文档的ID?
获取mongoc_collection_insert_one插入文档ID的正确方法
崩溃原因
你当前代码崩溃的核心原因:如果插入时没有手动给insert文档指定_id,MongoDB会自动生成这个ID,但驱动不会把自动生成的_id回写到原始的insert文档中。此时bson_iter_init_find找不到_id字段,bson_iter_oid会返回空指针,后续调用bson_oid_to_string就会触发崩溃。
正确解决方案:从reply中提取ID
mongoc_collection_insert_one的reply参数会返回插入操作的结果,其中包含自动生成的insertedId字段(自动生成ID的场景下)。正确的提取步骤如下:
修正后的代码示例
#include <mongoc/mongoc.h> #include <stdio.h> int main() { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bson_t *insert; bson_t reply; char *str; bson_iter_t iter; const bson_oid_t *oid; char oidstr[25]; mongoc_init(); client = mongoc_client_new("mongodb://localhost:27017/"); collection = mongoc_client_get_collection(client, "test_db", "test_coll"); // 构造插入文档(未手动指定_id) insert = bson_new(); BSON_APPEND_UTF8(insert, "name", "test"); if (!mongoc_collection_insert_one(collection, insert, NULL, &reply, &error)) { fprintf(stderr, "%s\n", error.message); bson_destroy(insert); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return 1; } // 从reply中提取insertedId if (bson_iter_init_find(&iter, &reply, "insertedId")) { if (BSON_ITER_HOLDS_OID(&iter)) { oid = bson_iter_oid(&iter); bson_oid_to_string(oid, oidstr); printf("插入的文档ID:%s\n", oidstr); } else { fprintf(stderr, "insertedId不是OID类型\n"); } } else { fprintf(stderr, "未找到insertedId字段\n"); } // 资源释放 str = bson_as_json(&reply, NULL); printf("回复内容:%s\n", str); bson_free(str); bson_destroy(insert); bson_destroy(&reply); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return 0; }
补充说明
- 如果插入前手动给
insert文档指定了_id(比如用bson_oid_init生成后写入),可以直接从insert中提取_id,这种场景下你的原始代码不会崩溃,但无需依赖reply。 - 调用
bson_iter_init_find后必须检查返回值,确认找到目标字段后再执行后续操作,避免空指针访问。
内容的提问来源于stack exchange,提问作者soni
相关产品推荐
相关产品推荐

