У меня есть следующий документ в моей тестовой базе данных 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, пожалуйста?
Вы можете использовать метод .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;}
В конце концов, похоже, что метод 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 вместо array), потому что я искал другую коллекцию: $
Извините за шум. Я надеюсь, что приведенный выше фрагмент поможет другим понять, как управлять массивами с помощью драйвера MongoDB C ++.