[SERVER-10278] Assertion: 13111:wrong type for field 3 != 4 - MongoDB C++ driver Created: 21/Jul/13  Updated: 10/Dec/14  Resolved: 29/Jul/13

Status: Closed
Project: Core Server
Component/s: Internal Client
Affects Version/s: 2.4.0
Fix Version/s: None

Type: Question Priority: Minor - P4
Reporter: Michael Wayne Assignee: Unassigned
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Ubuntu 13.04, MongoDB C++ 2.4


Participants:

 Description   

In my MongoDB database I have documents of this form:

{ "timestamp" : "2012-01-15T17:56:14.85",
  "Event" : [ { "id" : "1851236846",
                "qualifier_id" : "209"
            },
            {
                "id" : "378258775",
                "qualifier_id" : "57",
                "value" : "1"
            }
        ]
    }
 
   {   "timestamp" : "2012-01-15T16:06:09.378"
 
   }

Some of them contain the array Event some don't.

When I'm trying to process the data using the C++ MongoDB driver 2.4:

while (cursor->more()) { 
  BSONObj bo = cursor->next();
  cout << "timestamp: " << bo.getStringField("timestamp") << std::endl;
 
  if(bo.hasElement("Event")) {
    cout<<"HERE"<< endl;
 
    std::vector<BSONElement> be = bo.getField("Event").Array(); // ---> at this line breaks!!
 
    for (unsigned int j = 0; j < be.size(); j++) {
              BSONObj bo2 = be[j].embeddedObject();
              cout << "Qualifier ID: " << bo2.getStringField("qualifier_id") << std::endl;
              cout << "Value: " << bo2.getStringField("value")<< std::endl;
    }
  }

I get this error:

timestamp: 2012-01-15T16:06:07.560
   HERE
   Qualifier ID: 212
   Value: 14.6
 
   Qualifier ID: 141
   Value: 89.2
 
   Qualifier ID: 213
   Value: 5.9
 
   Qualifier ID: 56
   Value: Back
 
   Qualifier ID: 140
   Value: 46.7
 
  timestamp: 2012-01-15T16:06:09.378
  HERE
  Sun Jul 21 20:06:16.974 
Assertion: 13111:wrong type for field (Event) 3 != 4
  caught wrong type for field (Event) 3 != 4

In conclusion the condition bo.hasElement("Event") is always true.(???) The program brakes here:

   std::vector<BSONElement> be = bo.getField("Event").Array();


When the array Event has no members.



 Comments   
Comment by Michael Wayne [ 23/Jul/13 ]

Thank you!

Comment by Scott Hernandez (Inactive) [ 21/Jul/13 ]

This means the field is an embedded document, not an array: http://bsonspec.org/#/specification

I suggest you use the shell to inspect your data and see which document has an embedded document, not an array. You could also print the _id to find it more easily. You may want to check the type before calling Array() (that is what Array does internally which resulted in the exception you got). See BSONType (::Array) for the constants/enum to use for checking.

Also, it is best to ask these kind of usage questions in the forum (https://groups.google.com/forum/#!forum/mongodb-user) and not to file a jira issue since it is not a bug.

Generated at Thu Feb 08 03:22:45 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.