我正在尝试使用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" : []
}
答案 0 :(得分:1)
您在光标对象被销毁后访问resultObj,但resultObj只是查看光标所拥有的数据。如果您需要将其生命周期延长到返回它的游标的生命周期,请在BSONObj上调用getOwned以获取拥有的副本。