diff options
Diffstat (limited to 'src/mongo/db/matcher/expression_array.cpp')
-rw-r--r-- | src/mongo/db/matcher/expression_array.cpp | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/src/mongo/db/matcher/expression_array.cpp b/src/mongo/db/matcher/expression_array.cpp index 4ca68653e3d..9f0b11f1424 100644 --- a/src/mongo/db/matcher/expression_array.cpp +++ b/src/mongo/db/matcher/expression_array.cpp @@ -128,14 +128,10 @@ void ElemMatchObjectMatchExpression::debugString(StringBuilder& debug, int level _sub->debugString(debug, level + 1); } -void ElemMatchObjectMatchExpression::toBSON(BSONObjBuilder* out) const { +void ElemMatchObjectMatchExpression::serialize(BSONObjBuilder* out) const { BSONObjBuilder subBob; - _sub->toBSON(&subBob); - if (path().empty()) { - out->append("$elemMatch", subBob.obj()); - } else { - out->append(path(), BSON("$elemMatch" << subBob.obj())); - } + _sub->serialize(&subBob); + out->append(path(), BSON("$elemMatch" << subBob.obj())); } @@ -202,16 +198,16 @@ void ElemMatchValueMatchExpression::debugString(StringBuilder& debug, int level) } } -void ElemMatchValueMatchExpression::toBSON(BSONObjBuilder* out) const { +void ElemMatchValueMatchExpression::serialize(BSONObjBuilder* out) const { BSONObjBuilder emBob; + for (unsigned i = 0; i < _subs.size(); i++) { - _subs[i]->toBSON(&emBob); - } - if (path().empty()) { - out->append("$elemMatch", emBob.obj()); - } else { - out->append(path(), BSON("$elemMatch" << emBob.obj())); + BSONObjBuilder predicate; + _subs[i]->serialize(&predicate); + BSONObj predObj = predicate.obj(); + emBob.appendElements(predObj.firstElement().embeddedObject()); } + out->append(path(), BSON("$elemMatch" << emBob.obj())); } @@ -239,7 +235,7 @@ void SizeMatchExpression::debugString(StringBuilder& debug, int level) const { } } -void SizeMatchExpression::toBSON(BSONObjBuilder* out) const { +void SizeMatchExpression::serialize(BSONObjBuilder* out) const { out->append(path(), BSON("$size" << _size)); } |