MongoDB BSON OID失败

时间:2016-01-20 17:25:39

标签: c mongodb mongodb-c

我正在使用MongoDB C库将文档插入同一数据库中的各种集合中,并且在调用BSON_APPEND_OID(doc,“_ id”,&)时,我会反复获取引用的错误(以及可爱的错误)。 OID);

希望在集合中使用相同的oid - 这样每个集合中的每个带时间戳的条目都会有相同的oid,那就是我开始收到错误的时候。所以我退出了,并尝试为每个条目创建新的OID,我仍然得到相同的错误。

我试图重新使用OID的第一版:

int insert_mongo(char json[100], char *coll, mongoc_client_t *client, bson_oid_t oid){

    mongoc_collection_t *collection;
    bson_error_t error;
    bson_t *doc;

    collection = mongoc_client_get_collection (client, "edison", coll);     
    doc = bson_new_from_json((const uint8_t *)json, -1, &error);
    BSON_APPEND_OID (doc, "_id", &oid);
    if (!doc) {
        fprintf (stderr, "%s\n", error.message);
        return EXIT_FAILURE;
    }

    if (!mongoc_collection_insert (collection, MONGOC_INSERT_NONE, doc, NULL, &error)) {
        fprintf (stderr, "%s\n", error.message);
        return EXIT_FAILURE;
    }
    bson_destroy (doc);
    mongoc_collection_destroy (collection);
    return EXIT_SUCCESS;
}

在我创建新OID的版本2中:

int insert_mongo(char json[100], char *coll, mongoc_client_t *client){

    mongoc_collection_t *collection;
    bson_error_t error;
    bson_t *doc;
    bson_oid_t oid;

    bson_oid_init (&oid, NULL);
    collection = mongoc_client_get_collection (client, "edison", coll);
    doc = bson_new_from_json((const uint8_t *)json, -1, &error);
    BSON_APPEND_OID (doc, "_id", &oid);
    if (!doc) {
        fprintf (stderr, "%s\n", error.message);
        return EXIT_FAILURE;
    }

    if (!mongoc_collection_insert (collection, MONGOC_INSERT_NONE, doc, NULL, &error)) {
        fprintf (stderr, "%s\n", error.message);
        return EXIT_FAILURE;
    }
    bson_destroy (doc);
    mongoc_collection_destroy (collection);
    return EXIT_SUCCESS;
}

这两个版本都会在第二次调用函数时出错 MongoDB bson_append_oid():前提条件失败:bson

1 个答案:

答案 0 :(得分:1)

不幸的是,我没有足够的声誉来发表评论,所以让我们来这里试试:)

  • 首先,您能为我们提供valgrind输出吗?使用-g标志编译程序,然后执行valgrind ./your_program。这将显示 程序段错误

  • 其次,我猜测您的JSON字符串不适合char[100],因此会在doc = bson_new_from_json((const uint8_t *)json, -1, &error);生成段错误。我可以想象,因为你启用了自动字符串长度检测(第二个参数-1),函数会在char[100]之后继续读取你的内存,因为它无法找到不适合的字符串的结尾进入缓冲区 要解决此问题,请将-1替换为100(即缓冲区的大小),然后查看是否存在错误消息,而不是现在的段错误。
    编辑:扩展这个想法,也可能是bson_new_from_json失败,因此doc仍然是 NULL ,并在下一行中尝试将OID附加到 NULL ,这可能会产生段错误。