使用c ++传统驱动程序的mongodb查询导致BSONElement:错误类型-64

时间:2016-02-25 15:22:50

标签: c++ mongodb bson

我正在尝试使用c ++ mongo驱动程序处理mongodb集合中的数组。但是我总是得到错误消息:

terminate called after throwing an instance of mongo::MsgAssertionException'
  what():  BSONElement: bad type -64
Aborted (core dumped)

我试图在谷歌上找到它,但如果找到的唯一答案告诉我修复我的数据库。我这样做了,但错误仍然存​​在。

我对这个错误感到很困惑。由mongo-shell打印的集合似乎没有被破坏,shell也没有声明任何错误(见下文)。所以我假设在我的代码中生成的向量rawDataArray(参见下文)保存有效数据。但是,当我尝试打印值时,我得到提到的错误消息。

我做错了什么?

非常感谢

迈克尔

PS:

我正在使用mongodb C ++旧版驱动程序,错误由以下代码生成:

mongo::DBClientConnection connection;
connection.connect("localhost");

mongo::BSONObj resultObj;
try 
{  
    std::auto_ptr<mongo::DBClientCursor> cursor = 
        connection.query("mydb.results", 
                MONGO_QUERY( "_id" << mongo::OID(resultID) ) );
    while (cursor->more())
    {
        resultObj = cursor->next();
    }
}
catch( const mongo::DBException &e ) 
{
    // error handling
}

// extract raw_data array
std::vector<mongo::BSONElement> rawDataArray;
if( resultObj.hasField("raw_data") )
{
    rawDataArray = resultObj["raw_data"].Array();
}
else
{
    // error handling
}

for(auto const & data : rawDataArray)
{
    std::cout << data << std::endl;

}

该系列看起来像:

db.getCollection('results').find({}).pretty()
{
    "_id" : ObjectId("56cf1315f7e0583e2c4ec702"),
    "experiment_id" : ObjectId("56c5b8e7e1fa370a1de9d06f"),
    "module_id" : ObjectId("56c5b8e7e1fa370a1de9d06e"),
    "raw_data" : [ 
        {
            "id_number" : "0accb65f4fc311",
            "box" : "0accb65f4fc3",
            "paper" : 1,
            "seed" : 1,
            "length" : 0,
            "time" : ISODate("2015-09-15T20:00:00.000Z")
        }, 
        {
            "id_number" : "0accb65f4fc312",
            "box" : "0accb65f4fc3",
            "paper" : 1,
            "seed" : 2,
            "length" : 0,
            "time" : ISODate("2015-09-15T20:00:00.000Z")
        }, 
        {
            "id_number" : "0accb65f4fc313",
            "box" : "0accb65f4fc3",
            "paper" : 1,
            "seed" : 3,
            "length" : 0,
            "time" : ISODate("2015-09-15T20:00:00.000Z")
        }, 
        ... skipped some data here, there are 204 nearly identical elements
        {
            "id_number" : "0accb65f4fc3451",
            "box" : "0accb65f4fc3",
            "paper" : 4,
            "seed" : 51,
            "length" : 0,
            "time" : ISODate("2015-09-15T20:00:00.000Z")
        }
    ],
    "processed_data" : []
}

1 个答案:

答案 0 :(得分:1)

您在光标对象被销毁后访问resultObj,但resultObj只是查看光标所拥有的数据。如果您需要将其生命周期延长到返回它的游标的生命周期,请在BSONObj上调用getOwned以获取拥有的副本。