日期:2014-05-16  浏览次数:20319 次

MongoDB C++应用 简单例子

假定你已经有了MongoDB server,并且工作在Ubuntu上,安装了GCC,下面的C++程序可以帮助你快速进入能够使用MongoDB的状态。

#include <cstdlib>
#include <mongo/client/connpool.h>
using namespace std;
using namespace mongo;

void SaveStatus(mongo::DBClientBase& session, string const& display_id, string const& status) {
    

    BSONObjBuilder condition;
    condition.append("display_id", mongo::OID(display_id));

    BSONObjBuilder status_field;
    status_field.append("status", status);

    BSONObjBuilder data;
    data.append("$set", status_field.obj());

    session.update("mydb.mycoll", mongo::Query(condition.obj()), data.obj());
}

/*
 * 
 */
int main(int argc, char** argv) {
    mongo::ScopedDbConnection con("localhost", 5000);//timeout is 5000
    mongo::DBClientBase& session = con.conn();
    

    
    BSONArrayBuilder display_ids;
    display_ids.append(mongo::OID("5061f915e4b045bab5e0c957"));

    BSONObjBuilder in_condition;
    in_condition.append("$in", display_ids.arr());
    
    BSONObjBuilder message_condition;
    message_condition.append("display_id", in_condition.obj());
    message_condition.append("status", "sending");
    
    BSONObjBuilder sortBuilder;
    sortBuilder.append("_id", 1);

    mongo::Query query(message_condition.obj());
    mongo::Query query2(query);
    mongo::Query query_with_sort(query.sort(sortBuilder.obj()));

    BSONObjBuilder update_field;
    update_field.append("status", "waiting");

    BSONObjBuilder set_field;
    set_field.append("$set", update_field.obj());
    session.update("mydb.mycoll", query2, set_field.obj(), false, true);
    
    
    con.done();
    return 0;
}


提示:

1.SaveStatus函数内部演示了简单的设置某个字段值的用法。

2.main函数中演示了更加复杂的用法,用$in作为update语句的查询条件。

3.最后的con.done()函数调用是必须的,因为连接必须回到池中。

4.session.update的查询条件不能带sort,否则更新不会成功,因此可以看到我的代码中专门复制了一个query2对象用于update, 而query_with_sort 可以用于一般的查询(find)。

5.BSONObject的obj方法只能被调用一次,第二次程序就会crash。

6.mongo::OID用来将字符串转换成OID对象,也就是常见的_id的值