我使用Mongo C ++驱动程序(legacy-1.0.2版本)的查询方法遇到了一些奇怪的行为。
特别是,我有一个给定的数据库(orion
)(里面有一些填充的数据)和一个程序,它计算给定查询表达式的此类数据库的给定集合(entities
)中的元素使用四种不同的方法:
程序代码:
#include <cstdlib>
#include <iostream>
#include "mongo/client/dbclient.h" // for the driver
// Compilation hint: g++ example.cpp -pthread -lmongoclient -lboost_thread -lboost_system -lboost_regex -o example
using namespace mongo;
int main() {
client::initialize();
DBClientConnection c;
std::auto_ptr<DBClientCursor> cursor;
c.connect("localhost");
BSONObj q = BSON("_id.servicePath" << BSON ( "$in" << BSON_ARRAY( "/qa_fermin") ) );
int n1 = c.count("orion.entities", q);
cursor = c.query("orion.entities", q);
int n2 = cursor->itcount();
cursor = c.query("orion.entities", q, 1000);
int n3 = cursor->itcount();
cursor = c.query("orion.entities", q, 1000, 0);
int n4 = cursor->itcount();
std::cout << "using count: " << n1 << std::endl;
std::cout << "plain query: " << n2 << std::endl;
std::cout << "query + limit: " << n3 << std::endl;
std::cout << "query + limit + skip: " << n4 << std::endl;
}
据我所知,所有情况下的结果都应该相同。但是,这是我得到的输出:
using count: 307
plain query: 307
query + limit: 188
query + limit + skip: 188
似乎最后两种情况(查询+限制和查询+限制+跳过)检索的文档少于预期。
据我所知,在4种情况下结果应该相同,无论查询表达式和数据库,只要限制值大于集合中文档的总数。
我有&#34;感觉&#34;它可能与光标在某种程度上的行为方式有关,但我无法弄清楚如何...请理解有助于理解这种行为的任何想法。
编辑:我已经&#34;隔离&#34;步骤2和3,查看MongoDB服务器日志(查询子系统的详细级别设置为5)。我添加了跟踪,只是它们可能很有用(省略前缀时间戳,使它们更短):
在普通查询的情况下(返回307结果的那个):
D QUERY [conn108926] Enough for first batch, wantMore=1 ntoreturn=0 numResults=47
D QUERY [conn108926] caching executor with cursorid 104197639043543 after returning 47 results
...
D QUERY [conn108926] Running getMore, cursorid: 104197639043543
D QUERY [conn108926] getMore saving client cursor ended with state ADVANCED
D QUERY [conn108926] getMore returned 188 results
...
D QUERY [conn108926] Running getMore, cursorid: 104197639043543
D QUERY [conn108926] getMore NOT saving client cursor, ended with state IS_EOF
D QUERY [conn108926] getMore returned 72 results
(似乎有第一批47,第二批188,最终72; 47 + 188 + 72 = 307)
在query + limit(错误返回188的那个)的情况下:
D QUERY [conn108927] Enough for first batch, wantMore=0 ntoreturn=1000 numResults=188
D QUERY [conn108927] Not caching executor but returning 188 results.
(只有一个批次,其大小通常是&#34; righ query&#34; case中第二批的大小)。
答案 0 :(得分:3)
您可以尝试升级到legacy-1.0.6或更新版本吗?在该版本(https://jira.mongodb.org/browse/CXX-699)
中修复了与游标管理相关的错误