2

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;
}

出力は次のとおりです。

{ _id: ObjectId('51138456732fb764c4464fde'), x: new Date(1360233558334) }

http://api.mongodb.org/cplusplushttp://docs.mongodb.org/ecosystem/drivers/cpp-bson-array-examples/のドキュメントに従おうとしていますが、かなり貧弱です。配列を処理する他の例を見つけましたが、常に単純な型(整数の配列など)を使用していますが、配列内の要素がBSONドキュメント自体である場合はそうではありません。

どの要素が一般的なBSON要素である配列を処理するコード例がありますか?

4

2 に答える 2

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;


}
于 2013-02-11T23:30:31.443 に答える
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)を誤って取得していました:$

騒音でごめんなさい。上記のフラグメントが、MongoDBC++ドライバーを使用して配列を操作する方法を他の人が理解するのに役立つことを願っています。

于 2013-02-12T14:28:38.250 に答える