zoukankan      html  css  js  c++  java
  • mongoDB C++类对象使用

    建立连接:

    try {
      mongo::DBClientConnection c;
      c.connect("localhost");
      std::cout << "connected ok" << std::endl; 
    } 
    catch( const mongo::DBException &e ) 
    { 
      std::cout << "caught " << e.what() << std::endl; 
    }

    插值 

    往数据库中保存数据必须创建BSONObj类的对象,BSONObj下各组件都可以叫做BSONElement对象。使用BSONObjBuilder构造各种BSON对象,用BSONObjIterator来遍历各BSON对象。

    以下构造的BSON对象——“person”包含有name和age,我们这样调用:

    BSONObjBuilder b;
    b.append("name", "Joe");
    b.append("age", 33);
    BSONObj p = b.obj();

    更简明的方式是:

    BSONObj p = BSONObjBuilder().append("name", "Joe").append("age", 33).obj();

    还可以使用stream-oriented语法:

    BSONObjBuilder b;
    b << "name" << "Joe" << "age" << 33;
    BSONObj p = b.obj();

    而使用宏BSON则是最紧凑的:

    BSONObj p = BSON( "name" << "Joe" << "age" << 33 );

    通过使用GENOID 这个helper标记可以为对象增加一个object id。 GENOID (产生mongo::IOD类型值)字段是可选,若没有显式列出,服务端插入时会自动增加一个_id字段:

    BSONObj p = BSON( GENOID << "name" << "Joe" << "age" << 33 );
    // result is: { _id : ..., name : "Joe", age : 33 }

    若是使用non-stream构建语法创建,则GENOID应放在生成对象的开始位置:

    BSONObj p = BSONObjBuilder().genOID().append("name","Joe").append("age",33).obj();

    构建后即可将person BSON对象这样插入persons collection

    c.insert("tutorial.persons", p);

    以下代码获取persons collection的所有对象,并逐一显式

    cout << "count:" << c.count("tutorial.persons") << endl;    //先输出对象数量
    
    auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", BSONObj());  //一个空的BSON对象
    while (cursor->more())
       cout << cursor->next().toString() << endl;

      BSONObj() 指代一个空BSON对象——即表示{},而query条件为空即表示搜索全表。

      使用BSONObj::toString可获得关于对象的概要JSON String,要想获得完整输出,应用BSONObj::jsonString,获得单个字段的字符串类型的值则使用

    .getStringField("name"),函数原型及相关可参见MongoDB 2.4.0 API Doc[BSONObj]
     而更普遍的做法则是获得BSONElement对象再取值:
         BSONElement name=p["name"];     //或者 BSONElement name = p.getField("name");
      std::string nameStr = name.str();    //各种不同数据类型的取值函数参见MongoDB 2.4.0 API Doc[BSONElement]

    若要设置query条件,可如下构造一个QUERY类对象:

    auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", QUERY("age" << age ));

    排序

    进一步若要使返回的结果集按name的字母序排序,则可通过使用Query::sort()来给query表达式增加一个更改项(modifier)

    auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", QUERY("age" << age ).sort("name"));

    索引

    若想用age字段作为索引,来加速查询,则可以这样:

    c.ensureIndex("tutorial.persons", fromjson("{age:1}"));

    ensureIndex会先做同样的索引存在检测,若无则创建。ensureIndex是智能的,不会向服务端重复发送,因而就算多次调用它也是安全的。

    fromjson函数用于把JSON String转换为BSON String,某些情况下这种方式指定BSON更方便。

    而用BSON宏的方式则为:

    c.ensureIndex("tutorial.persons", BSON( "age" << 1 ));

    修改

    通过使用Update()方法修改数据库(将name为Joe者的age改为33、visits字段值增1):

    c.update("tutorial.persons",
               BSON("name" << "Joe" << "age" << 33),
               BSON("$inc" << BSON( "visits" << 1)));

     再举一例:

    SQL原型为:            UPDATE users  SET a=a+2 WHERE b='q'

    对应 Mongo Shell: db.users.update({b:'q'}, {$inc:{a:2}},false,true)

    C++代码:

    c.update("mydb.users", QUERY("b"<<"q"), BSON("$inc"<<BSON("a"<<2)), false, true);  //最后两项表示是否upsert、是否批修改
    // optionally:
    string err = c.getLastError();
    bool ok = err.empty();

    删除
    使用remove()删除文档:

    c.remove("tutorial.persons", QUERY("name"<<"Tim"));


  • 相关阅读:
    Lc1049_最后一块石头的重量II
    Lc343_整数拆分
    MySQL使用Limit关键字限制查询结果的数量效率问题
    Lc62_不同路径
    Java几种序列化方式对比
    3、你平时工作用过的JVM常用基本配置参数有哪些?
    2、你说你做过JVM调优和参数配置,请问如何盘点查看MM系统默认值
    强引用、软引用、弱引用、虚引用分别是什么?
    零拷贝
    并发编程面试题-锁的优化 和 happen-before原则
  • 原文地址:https://www.cnblogs.com/edgarli/p/3046699.html
Copyright © 2011-2022 走看看