//b will be the value part of an array-typed BSONElement void Projection::appendArray( BSONObjBuilder& b , const BSONObj& a , bool nested) const { int skip = nested ? 0 : _skip; int limit = nested ? -1 : _limit; if (skip < 0) { skip = max(0, skip + a.nFields()); } int i=0; BSONObjIterator it(a); while (it.more()) { BSONElement e = it.next(); if (skip) { skip--; continue; } if (limit != -1 && (limit-- == 0)) { break; } switch(e.type()) { case Array: { BSONObjBuilder subb; appendArray(subb , e.embeddedObject(), true); b.appendArray(b.numStr(i++), subb.obj()); break; } case Object: { BSONObjBuilder subb; BSONObjIterator jt(e.embeddedObject()); while (jt.more()) { append(subb , jt.next()); } b.append(b.numStr(i++), subb.obj()); break; } default: if (_include) b.appendAs(e, b.numStr(i++)); } } }