0

Windows 7 64 SP1 -- MongoDB 2.2.0-rc2 -- Boost 1.42 -- MS VS 2010 Ultimate -- C++ 驱动程序

我写了这个函数:

void printQuery(DBClientConnection &c, std::string &dc, const Query &qu = BSONObj(), std::string sortby = "" )

这个片段:

auto_ptr<DBClientCursor> cursor;
cursor = c.query(dc,qu.sort(sortby))

引发错误:

error C2663: 'mongo::Query::sort' : 2 overloads have no legal conversion for 'this' pointer.

sort (const string &field, int asc=1)应该是适用的过载。我相信这与使用const Query&它的成员函数有关sort。但是,如果我将其更改为Query&没有const,那么我的参数初始化= BSONObj()会引发:

cannot convert from 'mongo::BSONObj' to 'mongo::Query &'

如果我按值传递,那么它编译得很好。

有没有办法避免任何一个错误(除了按值传递)?谢谢!

4

2 回答 2

1

MongoDB 用户的David Hows向我介绍了解决方案:

而不是const Query &qu = BSONObj(),使用Query &qu = Query().

  1. 使用const“因为排序会改变查询对象的值 - 它被定义为常量”时出现错误。所以我放弃了它。

  2. 使用 BSONObj() 作为默认值是有问题的,因为我不是“创建一个新对象,而是将一个新的 BSONObj 分配给一个 Query 对象的变量,没有创建任何新的,因此没有构造函数调用。”

所以我改用 Query() 。if ( qu.obj == BSONObj() )用于测试 qu 是否为空。

我的最终功能是:

void printQuery(DBClientConnection &c, const string &dc, Query &qu = Query(), const string &sortby = "" )

我无法使DBClientConnection合格的 as const。它no legal conversion for 'this' pointer在使用 c.query 和

C2662: 'mongo::DBClientWithCommands::count' : cannot convert 'this' pointer from 'const mongo::DBClientConnection' to 'mongo::DBClientWithCommands &' Conversion loses qualifiers

使用 c.count 时。所以我保持它不合格。

于 2012-09-13T07:04:20.897 回答
0

您应该对光标进行排序,而不是 on qu,我认为这是您的 BSON 查询。例如。

auto_ptr<DBClientCursor> cursor;
cursor = c.query(dc,qu).sort(sortby)

查看http://www.mongodb.org/pages/viewpage.action?pageId=133415#C%2B%2BTutorial-Sorting了解更多信息。

于 2012-09-12T18:38:44.513 回答