`
jack_boy
  • 浏览: 138031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mongodb C++ driver中的逻辑操作“或”

阅读更多

Mongodb中的查询操作比较丰富,支持逻辑操作,如:

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

在C++ driver中如何实现或查询呢?

源码包中的example中没有这样的例子,经过一番查找在bsonobjbuilder.h和jsobjtests.cpp找到相关代码

BSONObj actual() { 
         return OR( BSON( "a" << GT << 1 << LTE << "x"),
                          BSON( "b" << NE << 1 << NE << "f" << NE << 22.3),
                          BSON( "x" << "p" ) );
}

 

inline BSONObj OR(const BSONObj& a, const BSONObj& b)
{ return BSON( "$or" << BSON_ARRAY(a << b) ); }
inline BSONObj OR(const BSONObj& a, const BSONObj& b, const BSONObj& c)
{ return BSON( "$or" << BSON_ARRAY(a << b << c) ); }
inline BSONObj OR(const BSONObj& a, const BSONObj& b, const BSONObj& c, const BSONObj& d) { return BSON( "$or" << BSON_ARRAY(a << b << c << d) ); }
inline BSONObj OR(const BSONObj& a, const BSONObj& b, const BSONObj& c, const BSONObj& d, const BSONObj& e)
{ return BSON( "$or" << BSON_ARRAY(a << b << c << d << e) ); }
inline BSONObj OR(const BSONObj& a, const BSONObj& b, const BSONObj& c, const BSONObj& d, const BSONObj& e, const BSONObj& f)
{ return BSON( "$or" << BSON_ARRAY(a << b << c << d << e << f) ); }

可以看出有两种方法
  1. 使用OR函数
  2. 使用$or + BSON_ARRAY构造
  • 先看第一种方法:使用OR函数构造查询语句
mongo::BSONObj query_obj;
query_obj = mongo::OR(BSON("n"<<max_v), BSON("a"<<"test1"), BSON("a"<<"test2"));
auto_ptr<mongo::DBClientCursor> cursor = conn.query("test.c1", mongo::Query(query_obj));

 查询时调用mongo::Query(BSONobj &obj)方法

  •  再看第二种方法
auto_ptr<mongo::DBClientCursor> cursor = conn.query("test.c1", QUERY("$or" << BSON_ARRAY(BSON("n" << max_v) << BSON("a" << "test1") << BSON("a" << "test2"))));

 查询时调用QUERY(X)宏

#define QUERY(x) ::mongo::Query( BSON(x) )

 两种方法从代码来看,其实是一样的,只是外观不同,可以任意使用。

 

问题:如何动态的构造一个OR操作呢?

如:在一个数组里,有多个查询参数,在运行中可变,因此不能用写死的方法,调用宏在这种情况下不合适。既然宏能构造数组,那么宏所调用的函数必定支持动态数组的创建,因为对于C++driver来说,引用中创建的数组都是动态的!

方法如下:

vector<string> ids;
ids.push_back("1001");
ids.push_back("1002");
ids.push_back("1003");

mongo::BSONArrayBuilder ab;
for (vector<string>::iterator it = ids.begin(); it != ids.end(); ++it) {
        tmp = BSON("mid" << *it);
        ab << tmp;
}
mongo::BSONArray or_array;
or_array = ab.arr();
auto_ptr<mongo::DBClientCursor> cursor = conn.query("test.c1", QUERY("$or" << or_array));
while (cursor->more()) {
        mongo::BSONObj p = cursor->next();
        cout << p.getStringField("a") << endl;
}

 

 这里用到了BSONArrayBuilder类,它用于构造BSONArray类,构造完成后,调用arr()方法得到BSONArray对象。

BSONArrayBuilder与BSONObjBuilder都支持直接将想要的数据添加到Builder中

 

BSONArrayBuilder ab;
ab << "item1";
ab << "item2";
ab << "item3";
BSONArray myArray = ab.arr();
# {[ "item1", "item2", "item3"] }

BSONObjBuilder ob;
ob << "key" << "item1";
BSONObj query = ob.obj();
# {"key": "item1"}
mongo::BSONObj obj1 = BSON("$or" << or_array);
cout << obj1.jsonString() << endl; 

 运行结果为:

{ "$or" : [ { "mid" : "1001" }, { "mid" : "1002" }, { "mid" : "1003" } ] }

此时数组的构造问题解决了,还有一个问题,“有时候,需要在逻辑查询之后,再进行一次赛选,如何将逻辑操作与其它的查询条件结合呢?

根据BSON()的定义

 

#define BSON(x) (( ::mongo::BSONObjBuilder(64) << x ).obj())
 可知,经过BSON宏处理过后得到的是一个BSONOjb,BSONObj是缺少BSON构造功能的,只能通过BSONObjBuilder构造,需要用到如下两个函数

 

 

    template<class T>
    inline BSONObjBuilder& BSONObjBuilderValueStream::operator<<( T value ) {
        _builder->append(_fieldName, value);
        _fieldName = StringData();      
        return *_builder;      
    }   
        
    inline BSONObjBuilder& BSONObjBuilderValueStream::operator<<( const BSONElement& e ) {
        _builder->appendAs( e , _fieldName );
        _fieldName = StringData();      
        return *_builder;      
    } 
 注意到BSONObjBuilder的operation<<的参数是BSONElement 与 class T,经过测试,不直接支持BSONObj与BSONArray,即连个BSONObj不能直接相连
BSONObj obj1;
BSONObj obj2;
obj1 = BSON("id" << "2");
obj2 = BSON("name" << "joe");
obj1 << obj2;
 这是不允许的,上面只是一个简单的示例,用以说明情况。
如果要让逻辑操作与一个查询条件相结合,不能直接将两个BSONObj连起来,需要通过BSONOjbBuilder来构造。
mongo::BSONObjBuilder objbuilder;
objbuilder << "$or" << or_array << "price" << BSON( "$gt" << 1000);
cout << objbuilder.obj().jsonString() << endl;

其运行结果为类似的:

{ "$or" : [ { "mid" : "1001" }, { "mid" : "1002" }, { "mid" : "1003" } ], "price" : { "$gt" : 100 } }

按照规则可以组成我们需要的查询条件。
注意以下几点即可:
1. $and, $or, $gt, $lt等操作用BSON(X)宏包起来,转换成一个BSONObj
2. BSONObj中间不可以直接用”<<"运算符相连
3. 用BSONObjBuilder与BSONArrayBuilder代替BSON(X) 与BSON_ARRAY(X)宏构造BSONOjb与BSONArray,会更加灵活
4. 用jsonString()成员函数输出结果,查看是否为想要的BSON查询
分享到:
评论

相关推荐

    MongoDB C++ Driver 3.4.x

    MongoDB C++ Driver 3.4.x 是MongoDB官方提供的一款C++编程接口,用于在C++应用程序中与MongoDB数据库进行交互。这个版本的驱动适用于64位Windows操作系统,并且包含了debug版本的库文件,这通常是开发人员在调试...

    MongoDB C++ Driver 3.4.x release

    在实际开发中,使用MongoDB C++ Driver 3.4.x 版本可以极大地提升MongoDB应用的开发效率和性能,同时享受到MongoDB提供的强大数据管理能力。通过不断学习和熟练掌握这个驱动,开发者可以构建出高效、稳定的C++ ...

    C++ Driver for MongoDB.zip

    这个压缩包"MongoDB C++ Driver for MongoDB.zip"很可能包含了源代码和其他相关资源,使得开发人员能够集成到他们的C++项目中,以便进行数据存储和检索。 首先,C++驱动程序提供了基本的数据库操作接口,如连接到...

    mongodb-driver-sync-4.2.3-API文档-中英对照版.zip

    赠送jar包:mongodb-driver-sync-4.2.3.jar; 赠送原API文档:mongodb-driver-sync-4.2.3-javadoc.jar; 赠送源代码:mongodb-driver-sync-4.2.3-sources.jar; 赠送Maven依赖信息文件:mongodb-driver-sync-4.2.3....

    mongodb-driver-core-4.2.3-API文档-中文版.zip

    赠送jar包:mongodb-driver-core-4.2.3.jar; 赠送原API文档:mongodb-driver-core-4.2.3-javadoc.jar; 赠送源代码:mongodb-driver-core-4.2.3-sources.jar; 赠送Maven依赖信息文件:mongodb-driver-core-4.2.3....

    mongodb-driver-sync-4.2.3-API文档-中文版.zip

    赠送jar包:mongodb-driver-sync-4.2.3.jar; 赠送原API文档:mongodb-driver-sync-4.2.3-javadoc.jar; 赠送源代码:mongodb-driver-sync-4.2.3-sources.jar; 赠送Maven依赖信息文件:mongodb-driver-sync-4.2.3....

    MongoDB Java Driver 简单操作

    ### MongoDB Java Driver 简单操作详解 #### 一、简介 MongoDB 是一款非常流行的文档型数据库系统,因其灵活性和高性能而被广泛应用于多种场景之中。为了方便开发者使用 Java 进行开发,MongoDB 提供了官方的 Java ...

    mongodb-driver-core-3.5.0.jar

    `mongodb-driver-3.5.0.jar`是完整版的MongoDB Java驱动,它扩展了`mongodb-driver-core`,提供了更高级别的操作接口,如`MongoClient`和`MongoDatabase`,方便开发者进行数据库操作。这个驱动程序使开发者能够方便...

    mongodb c#驱动最新驱动mongodb.driver.dll 版本2.12.0-beta1

    MongoDB.Driver.dll 是 C# 驱动的核心组件,它包含了连接、查询、更新和操作 MongoDB 数据库所需的所有功能。这个版本的更新可能引入了新的特性和性能改进,也有可能修复了一些已知的问题。开发者在升级到此版本时,...

    mongodb-driver-3.4.3

    mongodb-driver-3.4.3,mongodb java开发中常用组件。

    MongoDB_3.8.2驱动jar包及其同版本依赖包bson和mongodb-driver-core

    java和mongodb连接,需要mongodb-driver,您还必须下载其依赖项: bson和 mongodb-driver-core》》3个包: mongodb-driver-3.8.2.jar; bson-3.8.2.jar; mongodb-driver-core-3.8.2.jar

    mongodb-driver-core-4.3.3.jar

    mongodb-driver-core 4.3.3版本

    mongodb的c++连接接口

    5. **基本用法**:C++ 驱动通常通过创建 `MongoDB::Client` 对象来建立到 MongoDB 服务器的连接,然后使用 `MongoDB::Database` 和 `MongoDB::Collection` 对象来操作数据。例如,你可以创建一个会话,选择数据库,...

    mongodb-driver-core-3.4.3

    mongodb-driver-core-3.4.3,mongodb java开发常用组件。

    MongoDB-C++-Driver3.2.rar

    MongoDB-C++-Driver3.2是MongoDB官方提供的C++编程接口,允许开发人员在C++应用程序中与MongoDB数据库进行交互。这个驱动程序包含了头文件和动态链接库,使得Windows平台上的开发者能够轻松地将其集成到自己的项目中...

    mongodb-driver-core-4.2.3-API文档-中英对照版.zip

    赠送jar包:mongodb-driver-core-4.2.3.jar; 赠送原API文档:mongodb-driver-core-4.2.3-javadoc.jar; 赠送源代码:mongodb-driver-core-4.2.3-sources.jar; 赠送Maven依赖信息文件:mongodb-driver-core-4.2.3....

    MongoDB C/C++开发使用案例Demo

    通过这个MongoDB C/C++开发案例Demo,你可以了解到如何在C++程序中与MongoDB交互,包括连接数据库、执行CRUD操作、以及处理查询结果等。实践中,你可以根据提供的源代码例子进行学习,理解每一步的操作,并尝试...

    mongodb-driver-3.9.1.zip_MongoDB

    在Java开发中,为了能够与MongoDB进行交互,我们需要使用MongoDB的Java驱动程序,这就是"mongodb-driver-3.9.1.zip"提供的内容。这个压缩包包含了一个重要的文件:"mongodb-driver-3.9.1.jar",这是Java应用程序连接...

    MongoDb C++ win32 驱动

    8. **错误排查**:在编译或运行过程中遇到问题时,可以参考`mongodb C++编译 .txt`,它可能包含了常见问题和解决方法。 总的来说,构建MongoDB C++ Win32驱动需要对C++编程、Windows系统、MongoDB API以及可能的第...

Global site tag (gtag.js) - Google Analytics