diff options
author | Wan Bachtiar <sindbach@gmail.com> | 2017-06-16 15:45:51 +1000 |
---|---|---|
committer | Tess Avitabile <tess.avitabile@mongodb.com> | 2017-06-27 09:39:35 -0400 |
commit | 7bb1b5f71c2b7b48802ef5b41860713e2add25e0 (patch) | |
tree | 3d8c956eff8621ce25723eb4f211887cd90384af | |
parent | 4b411d4be8effda571e2f6f7f1e542b6afce8438 (diff) | |
download | mongo-7bb1b5f71c2b7b48802ef5b41860713e2add25e0.tar.gz |
SERVER-29676 arrayToObject should not error out on explicit value of null or undefined for value
Closes #1158
Signed-off-by: Tess Avitabile <tess.avitabile@mongodb.com>
(cherry picked from commit 21f0ae2d10531d0897c55c7be16f783abb6a8e1d)
-rw-r--r-- | jstests/aggregation/expressions/arrayToObject.js | 68 | ||||
-rw-r--r-- | src/mongo/db/pipeline/expression.cpp | 2 |
2 files changed, 42 insertions, 28 deletions
diff --git a/jstests/aggregation/expressions/arrayToObject.js b/jstests/aggregation/expressions/arrayToObject.js index 9e3b4614665..5ec450a79eb 100644 --- a/jstests/aggregation/expressions/arrayToObject.js +++ b/jstests/aggregation/expressions/arrayToObject.js @@ -52,48 +52,62 @@ result = coll.aggregate([{$match: {_id: 6}}, array_to_object_expr]).toArray(); assert.eq(result, [{_id: 6, collapsed: null}]); - assert.writeOK(coll.insert({_id: 7, expanded: [{"k": "price", "v": 24}, ["item", "apple"]]})); - assertErrorCode(coll, [{$match: {_id: 7}}, array_to_object_expr], 40391); + assert.writeOK(coll.insert({_id: 7, expanded: [{"k": "price", "v": null}]})); + result = coll.aggregate([{$match: {_id: 7}}, array_to_object_expr]).toArray(); + assert.eq(result, [{_id: 7, collapsed: {"price": null}}]); - assert.writeOK(coll.insert({_id: 8, expanded: [["item", "apple"], {"k": "price", "v": 24}]})); - assertErrorCode(coll, [{$match: {_id: 8}}, array_to_object_expr], 40396); + assert.writeOK(coll.insert({_id: 8, expanded: [{"k": "price", "v": undefined}]})); + result = coll.aggregate([{$match: {_id: 8}}, array_to_object_expr]).toArray(); + assert.eq(result, [{_id: 8, collapsed: {"price": undefined}}]); - assert.writeOK(coll.insert({_id: 9, expanded: "string"})); - assertErrorCode(coll, [{$match: {_id: 9}}, array_to_object_expr], 40386); + assert.writeOK(coll.insert({_id: 9, expanded: [{"k": "price", "v": 24}, ["item", "apple"]]})); + assertErrorCode(coll, [{$match: {_id: 9}}, array_to_object_expr], 40391); - assert.writeOK(coll.insert({_id: 10, expanded: ObjectId()})); - assertErrorCode(coll, [{$match: {_id: 10}}, array_to_object_expr], 40386); + assert.writeOK(coll.insert({_id: 10, expanded: [["item", "apple"], {"k": "price", "v": 24}]})); + assertErrorCode(coll, [{$match: {_id: 10}}, array_to_object_expr], 40396); - assert.writeOK(coll.insert({_id: 11, expanded: NumberLong(0)})); + assert.writeOK(coll.insert({_id: 11, expanded: "string"})); assertErrorCode(coll, [{$match: {_id: 11}}, array_to_object_expr], 40386); - assert.writeOK(coll.insert({_id: 12, expanded: [0]})); - assertErrorCode(coll, [{$match: {_id: 12}}, array_to_object_expr], 40398); + assert.writeOK(coll.insert({_id: 12, expanded: ObjectId()})); + assertErrorCode(coll, [{$match: {_id: 12}}, array_to_object_expr], 40386); - assert.writeOK(coll.insert({_id: 13, expanded: [["missing_value"]]})); - assertErrorCode(coll, [{$match: {_id: 13}}, array_to_object_expr], 40397); + assert.writeOK(coll.insert({_id: 13, expanded: NumberLong(0)})); + assertErrorCode(coll, [{$match: {_id: 13}}, array_to_object_expr], 40386); - assert.writeOK(coll.insert({_id: 14, expanded: [[321, 12]]})); - assertErrorCode(coll, [{$match: {_id: 14}}, array_to_object_expr], 40395); + assert.writeOK(coll.insert({_id: 14, expanded: [0]})); + assertErrorCode(coll, [{$match: {_id: 14}}, array_to_object_expr], 40398); - assert.writeOK(coll.insert({_id: 15, expanded: [["key", "value", "offset"]]})); + assert.writeOK(coll.insert({_id: 15, expanded: [["missing_value"]]})); assertErrorCode(coll, [{$match: {_id: 15}}, array_to_object_expr], 40397); - assert.writeOK(coll.insert({_id: 16, expanded: {y: []}})); - assertErrorCode(coll, [{$match: {_id: 16}}, array_to_object_expr], 40386); + assert.writeOK(coll.insert({_id: 16, expanded: [[321, 12]]})); + assertErrorCode(coll, [{$match: {_id: 16}}, array_to_object_expr], 40395); - assert.writeOK(coll.insert({_id: 17, expanded: [{y: "x", x: "y"}]})); - assertErrorCode(coll, [{$match: {_id: 17}}, array_to_object_expr], 40393); + assert.writeOK(coll.insert({_id: 17, expanded: [["key", "value", "offset"]]})); + assertErrorCode(coll, [{$match: {_id: 17}}, array_to_object_expr], 40397); - assert.writeOK(coll.insert({_id: 18, expanded: [{k: "missing"}]})); - assertErrorCode(coll, [{$match: {_id: 18}}, array_to_object_expr], 40392); + assert.writeOK(coll.insert({_id: 18, expanded: {y: []}})); + assertErrorCode(coll, [{$match: {_id: 18}}, array_to_object_expr], 40386); - assert.writeOK(coll.insert({_id: 19, expanded: [{k: 24, v: "string"}]})); - assertErrorCode(coll, [{$match: {_id: 19}}, array_to_object_expr], 40394); + assert.writeOK(coll.insert({_id: 19, expanded: [{y: "x", x: "y"}]})); + assertErrorCode(coll, [{$match: {_id: 19}}, array_to_object_expr], 40393); - assert.writeOK(coll.insert({_id: 20, expanded: [{y: "ignored", k: "item", v: "pear"}]})); + assert.writeOK(coll.insert({_id: 20, expanded: [{k: "missing"}]})); assertErrorCode(coll, [{$match: {_id: 20}}, array_to_object_expr], 40392); - assert.writeOK(coll.insert({_id: 21, expanded: NaN})); - assertErrorCode(coll, [{$match: {_id: 21}}, array_to_object_expr], 40386); + assert.writeOK(coll.insert({_id: 21, expanded: [{k: 24, v: "string"}]})); + assertErrorCode(coll, [{$match: {_id: 21}}, array_to_object_expr], 40394); + + assert.writeOK(coll.insert({_id: 22, expanded: [{k: null, v: "nullKey"}]})); + assertErrorCode(coll, [{$match: {_id: 22}}, array_to_object_expr], 40394); + + assert.writeOK(coll.insert({_id: 23, expanded: [{k: undefined, v: "undefinedKey"}]})); + assertErrorCode(coll, [{$match: {_id: 23}}, array_to_object_expr], 40394); + + assert.writeOK(coll.insert({_id: 24, expanded: [{y: "ignored", k: "item", v: "pear"}]})); + assertErrorCode(coll, [{$match: {_id: 24}}, array_to_object_expr], 40392); + + assert.writeOK(coll.insert({_id: 25, expanded: NaN})); + assertErrorCode(coll, [{$match: {_id: 25}}, array_to_object_expr], 40386); }()); diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp index a562144382b..7406e2ccaea 100644 --- a/src/mongo/db/pipeline/expression.cpp +++ b/src/mongo/db/pipeline/expression.cpp @@ -711,7 +711,7 @@ Value ExpressionArrayToObject::evaluateInternal(Variables* vars) const { str::stream() << "$arrayToObject requires an object with keys 'k' and 'v'. " "Missing either or both keys from: " << elem.toString(), - (!key.nullish() && !value.nullish())); + (!key.missing() && !value.missing())); uassert( 40394, |