2014-09-18 1 views
0

Я пытаюсь использовать API-интерфейс MONGO C++ для обработки множества записей, которые выглядят следующим образом ... Количество строк в массиве «Записи» является переменной: это либо 13 или 7.Обработка записи MONGO с вложенными массивами в C++

{ "_id" : ObjectId("541af7a4c9c7450a5a5c7e8e"), "SvId" : "SV120", "UTCTime" : "2014-09-18T15:17:56.541Z", "Interval" : 10, "HPLANC" : "DownlinkA", 
    "Entries" : [   
     [  {  "IPAddress" : "172.20.10.20" },  {  "Port" : 4096 },   
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.10.20" }, {  "Port" : 4097 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.10.20" },   {  "Port" : 4098 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.10.20" },   {  "Port" : 4099 }, 
       {  "MessageCount" : "0" },  {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.10.20" },   {  "Port" : 4103 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ],  
     [  {  "IPAddress" : "172.20.100.10" },  {  "Port" : 4102 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.100.10" },   {  "Port" : 4104 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.150.10" }, {  "Port" : 4100 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.200.10" },  {  "Port" : 4100 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.200.10" },  {  "Port" : 4150 }, 
       {  "MessageCount" : "0" },  {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.200.10" },  {  "Port" : 4151 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ],  
     [  {  "IPAddress" : "172.20.200.10" },  {  "Port" : 4152 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ], 
     [  {  "IPAddress" : "172.20.200.10" },  {  "Port" : 4153 }, 
       {  "MessageCount" : "0" },   {  "ByteCount" : "0" } ] ] } 

я запрашиваю коллекцию, основанную на UTCTime и свид ... когда я получаю записи назад, я не уверен в том, как выйти через них все ...

как правило, Я просто получаю курсор и перебираю набор возвращаемых записей с помощью «next()» ... но теперь у меня есть поле «Записи», которое содержит 7 или 13 записей. Как я могу получить доступ к каждому из этих элементов? Я предполагаю, что должно быть что-то вроде «субкурсора», которое я могу использовать для циклического преобразования.

Я просматриваю API и примеры, но на вложенных массивах не так много.

Спасибо,

Рик

+0

Единственное, что, кажется, заставляет меня закрыть (и не бросает исключение), обращается к BSONObj, возвращенному покупают запрос (и последующий next()) - dsuPoint.getFieldDotted("Entries.0.0.IPAddress"), которые возвращают «EOO» ... ??? – earnric

ответ

1

Here есть отличный пример того, как использовать массивы с де MongoDB API.

EDIT

Я строю пример:

#include "mongo/bson/bson.h" 

#include <iostream> 
#include <list> 
#include <vector> 

using mongo::BSONArray; 
using mongo::BSONArrayBuilder; 
using mongo::BSONObj; 
using mongo::BSONObjBuilder; 
using mongo::BSONElement; 

using namespace std; 

int main() { 
    // Build an object 
    BSONObjBuilder bob; 

    // Build a array 
    BSONArray arr = BSON_ARRAY(
          BSON_ARRAY(BSON("IPAddress" << "172.20.10.20") << BSON("Port" << 4096) << BSON("MessageCount" << 0) << BSON("ByteCount" << 0)) << 
          BSON_ARRAY(BSON("IPAddress" << "172.20.10.10") << BSON("Port" << 4100) << BSON("MessageCount" << 0) << BSON("ByteCount" << 0)) << 
          BSON_ARRAY(BSON("IPAddress" << "172.20.10.10") << BSON("Port" << 4150) << BSON("MessageCount" << 0) << BSON("ByteCount" << 0)) << 
          BSON_ARRAY(BSON("IPAddress" << "172.20.10.10") << BSON("Port" << 4152) << BSON("MessageCount" << 0) << BSON("ByteCount" << 0)) 
          ); 
    bob.appendArray("Entries", arr); 

    // Create the object 
    BSONObj an_obj = bob.obj(); 
    cout << "BSON: "<< an_obj << endl; 

    // Print the array out 
    vector<BSONElement> array = an_obj["Entries"].Array(); 
    for (vector<BSONElement>::iterator ar = array.begin(); ar != array.end(); ++ar){ 
     cout << *ar << endl; 
     vector<BSONElement> elem = ar->Array(); 
     for (vector<BSONElement>::iterator it = elem.begin(); it != elem.end(); ++it){ 
      cout << *it << endl; 
     } 
    } 
    cout << endl; 

    return 0; 
} 

Выход:

BSON: { Entries: [ [ { IPAddress: "172.20.10.20" }, { Port: 4096 }, { MessageCount: 0 }, { ByteCount: 0 } ], [ { IPAddress: "172.20.10.10" }, { Port: 4100 }, { MessageCount: 0 }, { ByteCount: 0 } ], [ { IPAddress: "172.20.10.10" }, { Port: 4150 }, { MessageCount: 0 }, { ByteCount: 0 } ], [ { IPAddress: "172.20.10.10" }, { Port: 4152 }, { MessageCount: 0 }, { ByteCount: 0 } ] ] } 
0: [ { IPAddress: "172.20.10.20" }, { Port: 4096 }, { MessageCount: 0 }, { ByteCount: 0 } ] 
0: { IPAddress: "172.20.10.20" } 
1: { Port: 4096 } 
2: { MessageCount: 0 } 
3: { ByteCount: 0 } 
1: [ { IPAddress: "172.20.10.10" }, { Port: 4100 }, { MessageCount: 0 }, { ByteCount: 0 } ] 
0: { IPAddress: "172.20.10.10" } 
1: { Port: 4100 } 
2: { MessageCount: 0 } 
3: { ByteCount: 0 } 
2: [ { IPAddress: "172.20.10.10" }, { Port: 4150 }, { MessageCount: 0 }, { ByteCount: 0 } ] 
0: { IPAddress: "172.20.10.10" } 
1: { Port: 4150 } 
2: { MessageCount: 0 } 
3: { ByteCount: 0 } 
3: [ { IPAddress: "172.20.10.10" }, { Port: 4152 }, { MessageCount: 0 }, { ByteCount: 0 } ] 
0: { IPAddress: "172.20.10.10" } 
1: { Port: 4152 } 
2: { MessageCount: 0 } 
3: { ByteCount: 0 } 

Я надеюсь, что это то, что вы ищете! Дай мне знать!

+0

Thx ... Но я тоже это нашел. Это действительно не помогает с дважды вложенным массивом, который, по вашему мнению, просто требует дополнительного уровня косвенности. Тем не менее, это не ... У меня есть массив массивов - и доступ через Array(). Array() .. или даже Array() [0] .Array(), похоже, не работает. Я экспериментировал со всеми перестановками, но никто не работает над этой коллекцией. Все они бросают исключение std. – earnric

+0

Прошлой ночью я построю пример, посмотрю мой первый пост! Дайте мне знать, если вы это ищете! – echo

+1

Thx! Это работает. – earnric

Смежные вопросы