我的MongoDB测试数据库中有以下文档:
> db.a.find().pretty()
{
"_id" : ObjectId("5113d680732fb764c4464fdf"),
"x" : [
{
"a" : 1,
"b" : 2
},
{
"a" : 3,
"b" : 4
}
]
}
我正在尝试访问和处理“x”数组中的元素。但是,似乎Mongo驱动程序不是将其识别为JSON文档数组,而是将其标识为Date类型,如以下代码所示:
auto_ptr<DBClientCursor> cursor = c.query("test.a", BSONObj());
while (cursor->more()) {
BSONObj r = cursor->next();
cout << r.toString() << std::endl;
}
输出是:
{ _id: ObjectId('51138456732fb764c4464fde'), x: new Date(1360233558334) }
我正在尝试按照http://api.mongodb.org/cplusplus和http://docs.mongodb.org/ecosystem/drivers/cpp-bson-array-examples/中的文档进行操作,但效果很差。我已经找到了处理数组的其他例子,但总是使用简单类型(例如整数数组),但是当数组中的元素本身就是BSON文档时却没有。
你有一些处理数组的代码示例,哪些元素是通用的BSON元素,请?
答案 0 :(得分:3)
您可以使用.Array()方法或getFieldDotted()方法:如下所示:
Query query = Query();
auto_ptr<DBClientCursor> cursor = myConn.query("test.a", query);
while( cursor->more() ) {
BSONObj nextObject = cursor->next();
cout << nextObject["x"].Array()[0]["a"] << endl;
cout << nextObject.getFieldDotted("x.0.a") << endl;
}
答案 1 :(得分:2)
最后,似乎embeddedObject()方法是关键:
auto_ptr<DBClientCursor> cursor = c.query("test.a", BSONObj());
while (cursor->more()) {
BSONObj r = cursor->next();
cout << "Processing JSON document: " << r.toString() << std::endl;
std::vector<BSONElement> be = r.getField("x").Array();
for (unsigned int i = 0; i<be.size(); i++) {
cout << "Processing array element: " << be[i].toString() << std::endl;
cout << " of type: " << be[i].type() << std::endl;
BSONObj bo = be[i].embeddedObject();
cout << "Processing a field: " << bo.getField("a").toString() << std::endl;
cout << "Processing b field: " << bo.getField("b").toString() << std::endl;
}
}
我错误地检索了不同的ObjectID和不同的类型(Date而不是数组),因为我正在寻找不同的集合:$
对不起噪音。我希望上面的片段能帮助其他人弄清楚如何使用MongoDB C ++驱动程序来操作数组。