我正在使用MongoDB C库将文档插入同一数据库中的各种集合中,并且在调用BSON_APPEND_OID(doc,“ _ id”,&oid)时,反复收到引用的错误(伴随一个可爱的看到错误);
我本来想在集合中使用相同的oid,以便每个集合中的每个带有时间戳的条目都具有相同的oid,这就是我开始收到错误的时间。因此,我放弃了这一点,并尝试为每个条目创建新的OID,但仍然遇到相同的错误。
我尝试重复使用OID的版本1:
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;
}
在版本2中,我创建了一个新的OID:
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
最佳答案
不幸的是,我没有足够的声誉来发表评论,所以让我们在这里尝试:)
首先,您可以向我们提供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,这可能会产生段错误。