Mongo C ++驱动程序query()方法没有得到它应该得到的所有结果

时间:2016-01-21 18:34:48

标签: c++ mongodb

我使用Mongo C ++驱动程序(legacy-1.0.2版本)的查询方法遇到了一些奇怪的行为。

特别是,我有一个给定的数据库(orion)(里面有一些填充的数据)和一个程序,它计算给定查询表达式的此类数据库的给定集合(entities)中的元素使用四种不同的方法:

  • 计数方法
  • 简单查询(即没有跳过参数的额外限制)
  • 使用大于集合中最大元素数量的限制进行查询(我使用1000,并且集合有886个元素)
  • 使用相同限制查询并跳至0

程序代码:

#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中第二批的大小)。

1 个答案:

答案 0 :(得分:3)

您可以尝试升级到legacy-1.0.6或更新版本吗?在该版本(https://jira.mongodb.org/browse/CXX-699

中修复了与游标管理相关的错误