Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用MongoDB C+处理通用BSON文档数组+;司机_C++_Arrays_Mongodb_Bson - Fatal编程技术网

C++ 使用MongoDB C+处理通用BSON文档数组+;司机

C++ 使用MongoDB C+处理通用BSON文档数组+;司机,c++,arrays,mongodb,bson,C++,Arrays,Mongodb,Bson,我的MongoDB测试数据库中有以下文档: > db.a.find().pretty() { "_id" : ObjectId("5113d680732fb764c4464fdf"), "x" : [ { "a" : 1, "b" : 2 }, { "a" : 3, "b" :

我的MongoDB测试数据库中有以下文档:

> db.a.find().pretty()
{
    "_id" : ObjectId("5113d680732fb764c4464fdf"),
    "x" : [
            {
                "a" : 1,
                "b" : 2
            },
            {
                "a" : 3,
                "b" : 4
            }
          ]
}
我正在尝试访问和处理“x”数组中的元素。但是,Mongo驱动程序似乎不是将其标识为JSON文档数组,而是日期类型,如以下代码所示:

auto_ptr<DBClientCursor> cursor = c.query("test.a", BSONObj());
while (cursor->more()) {      
  BSONObj r = cursor->next();
  cout << r.toString() << std::endl;
}
我试图在和中遵循文档,但它相当差。我还发现了处理数组的其他示例,但总是使用简单类型(例如整数数组),但当数组中的元素是BSON文档本身时就不是了

您是否有一些处理数组的代码示例,其中哪些元素是通用的BSON元素?

您可以使用.Array()方法或GetFieldDotterd()方法:如下所示:

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;


}
Query=Query();
auto_ptr cursor=myConn.query(“test.a”,query);
同时(光标->更多(){
BSONObj nextObject=光标->下一步();

cout最后,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;
  }
 }
auto_ptr cursor=c.query(“test.a”,BSONObj());
而(光标->更多()){
BSONObj r=光标->下一步();

此外,mongo shell和trace显示的ObjectID似乎不一样。很奇怪……我终于找到了一个解决方案,但还是感谢您的提示!我不知道本例中的[]符号和getFieldDotterd()方法。
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;
  }
 }