MongoDB BSON OID 失败
MongoDB BSON OID Failure
我正在使用 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
我 猜测 你的 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,这可能会产生段错误。
我正在使用 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
我 猜测 你的 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,这可能会产生段错误。