summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWan Bachtiar <sindbach@gmail.com>2017-06-16 15:45:51 +1000
committerTess Avitabile <tess.avitabile@mongodb.com>2017-06-27 09:39:35 -0400
commit7bb1b5f71c2b7b48802ef5b41860713e2add25e0 (patch)
tree3d8c956eff8621ce25723eb4f211887cd90384af
parent4b411d4be8effda571e2f6f7f1e542b6afce8438 (diff)
downloadmongo-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.js68
-rw-r--r--src/mongo/db/pipeline/expression.cpp2
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,