2013-06-21 68 views
-1

如何使用mongo-c-driver使用_id访问Mongo数据库中的文档?我想定义一个函数Mongo C驱动程序通过_id访问文档

void *get_doc_by_id(int obj_id) { 
    // return document if exists 
} 
+2

你跟着教程? http://api.mongodb.org/c/current/tutorial.html(特别是'query'部分?)'bson_append_oid'或'bson_append_int' – WiredPrairie

回答

2

首先,请记住,一个INT不能保证是大到足以容纳一个MongoDB的对象ID(在我所知道的所有情况下,是不是)。 MongoDB对象标识大小为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; 
} 
0

替代解决方案: ( 选择参数:

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); 
相关问题