如何使用 mongo-c-driver 仅使用其 _id 访问 Mongo 数据库中的文档?我想定义一个函数
void *get_doc_by_id(int obj_id) {
// return document if exists
}
如何使用 mongo-c-driver 仅使用其 _id 访问 Mongo 数据库中的文档?我想定义一个函数
void *get_doc_by_id(int obj_id) {
// return document if exists
}
首先,请记住,不能保证int大到足以容纳 MongoDB 对象 id(在我所知道的所有情况下,都不是)。MongoDB 对象 ID 大小为 96 位,而int通常大小为 32 位。
您可以尝试以下方法:
/**
* get_doc_by_id:
* @conn: A mongo connection.
* @db_and_collection: The "db.collection" namespace.
* @oid: A bson_oid_t containing the document id.
*
* Fetches a document by the _id field.
*
* Returns: A new bson* that should be freed with bson_destroy() if
* successful; otherwise NULL on failure.
*/
bson *
get_doc_by_id (mongo *conn,
const char *db_and_collection,
const bson_oid_t *oid)
{
bson query;
bson *ret = NULL;
mongo_cursor *cursor;
assert(conn);
assert(db_and_collection);
assert(oid);
bson_init(&query);
bson_append_oid(&query, "_id", oid);
cursor = mongo_find(conn, db_and_collection, &query, NULL, 1, 0, 0);
if (!cursor) {
goto cleanup;
}
if (mongoc_cursor_next(cursor) != MONGO_OK) {
goto cleanup;
}
ret = calloc(1, sizeof *ret);
if (!ret) {
goto cleanup;
}
bson_copy(ret, mongoc_cursor_bson(cursor));
cleanup:
if (cursor) {
mongo_cursor_destroy(cursor);
}
bson_destroy(&query);
return ret;
}
替代解决方案:(选定的参数:
const mongoc_collection_t *col;
const bson_oid_t *oid;
)
mongoc_cursor_t *cursor = NULL;
bson_error_t *err = NULL;
std::string oid_str;
bson_t *qry = bson_new();
std::string query;
bson_oid_to_string(oid, oid_str);
query = "{\"_id\":{\"$oid\":\"" + oid_str + "\"}}";
bson_init_from_json(qry, query.c_str(), -1, err);
cursor = mongoc_collection_find(col, MONGOC_QUERY_NONE,
0, 0, 0, qry, NULL, NULL);