You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:57:32