summaryrefslogtreecommitdiff
path: root/jstests/aggregation
diff options
context:
space:
mode:
authorWan Bachtiar <sindbach@gmail.com>2017-01-23 23:59:56 +1100
committerTess Avitabile <tess.avitabile@mongodb.com>2017-03-28 17:08:28 -0400
commite3ecb183d761c9e85ee2c6838e19a39f4af8fb40 (patch)
treea7761d01f8030931db07f9ba7530ffa20754a470 /jstests/aggregation
parentc7eed05b0a58b265bb65914d4a55dfb2a95d4127 (diff)
downloadmongo-e3ecb183d761c9e85ee2c6838e19a39f4af8fb40.tar.gz
SERVER-23310 Add aggregation expression $arrayToObject
Signed-off-by: Tess Avitabile <tess.avitabile@mongodb.com> (cherry picked from commit 5b8b1ca6364342d5a1bf21ec6c707edfae0f3555)
Diffstat (limited to 'jstests/aggregation')
-rw-r--r--jstests/aggregation/expressions/arrayToObject.js99
1 files changed, 99 insertions, 0 deletions
diff --git a/jstests/aggregation/expressions/arrayToObject.js b/jstests/aggregation/expressions/arrayToObject.js
new file mode 100644
index 00000000000..9e3b4614665
--- /dev/null
+++ b/jstests/aggregation/expressions/arrayToObject.js
@@ -0,0 +1,99 @@
+// Tests for $arrayToObject aggregation expression.
+(function() {
+ "use strict";
+
+ // For assertErrorCode().
+ load("jstests/aggregation/extras/utils.js");
+
+ let coll = db.array_to_object_expr;
+ coll.drop();
+
+ let array_to_object_expr = {$project: {collapsed: {$arrayToObject: "$expanded"}}};
+
+ // $arrayToObject correctly converts a key-value pairs to an object.
+ assert.writeOK(coll.insert({_id: 0, expanded: [["price", 24], ["item", "apple"]]}));
+ let result = coll.aggregate([{$match: {_id: 0}}, array_to_object_expr]).toArray();
+ assert.eq(result, [{_id: 0, collapsed: {"price": 24, "item": "apple"}}]);
+
+ assert.writeOK(
+ coll.insert({_id: 1, expanded: [{"k": "price", "v": 24}, {"k": "item", "v": "apple"}]}));
+ result = coll.aggregate([{$match: {_id: 1}}, array_to_object_expr]).toArray();
+ assert.eq(result, [{_id: 1, collapsed: {"price": 24, "item": "apple"}}]);
+
+ assert.writeOK(
+ coll.insert({_id: 2, expanded: [{"k": "price", "v": 24}, {"k": "item", "v": "apple"}]}));
+ result =
+ coll.aggregate([
+ {$match: {_id: 2}},
+ {
+ $project: {
+ collapsed:
+ {$arrayToObject: {$zip: {inputs: ["$expanded.k", "$expanded.v"]}}}
+ }
+ }
+ ])
+ .toArray();
+ assert.eq(result, [{_id: 2, collapsed: {"price": 24, "item": "apple"}}]);
+
+ assert.writeOK(coll.insert({_id: 3, expanded: []}));
+ result = coll.aggregate([{$match: {_id: 3}}, array_to_object_expr]).toArray();
+ assert.eq(result, [{_id: 3, collapsed: {}}]);
+
+ // $arrayToObject outputs null on null-ish types.
+ assert.writeOK(coll.insert({_id: 4}));
+ result = coll.aggregate([{$match: {_id: 4}}, array_to_object_expr]).toArray();
+ assert.eq(result, [{_id: 4, collapsed: null}]);
+
+ assert.writeOK(coll.insert({_id: 5, expanded: null}));
+ result = coll.aggregate([{$match: {_id: 5}}, array_to_object_expr]).toArray();
+ assert.eq(result, [{_id: 5, collapsed: null}]);
+
+ assert.writeOK(coll.insert({_id: 6, expanded: undefined}));
+ 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: 8, expanded: [["item", "apple"], {"k": "price", "v": 24}]}));
+ assertErrorCode(coll, [{$match: {_id: 8}}, array_to_object_expr], 40396);
+
+ assert.writeOK(coll.insert({_id: 9, expanded: "string"}));
+ assertErrorCode(coll, [{$match: {_id: 9}}, array_to_object_expr], 40386);
+
+ assert.writeOK(coll.insert({_id: 10, expanded: ObjectId()}));
+ assertErrorCode(coll, [{$match: {_id: 10}}, array_to_object_expr], 40386);
+
+ assert.writeOK(coll.insert({_id: 11, expanded: NumberLong(0)}));
+ 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: 13, expanded: [["missing_value"]]}));
+ assertErrorCode(coll, [{$match: {_id: 13}}, array_to_object_expr], 40397);
+
+ assert.writeOK(coll.insert({_id: 14, expanded: [[321, 12]]}));
+ assertErrorCode(coll, [{$match: {_id: 14}}, array_to_object_expr], 40395);
+
+ assert.writeOK(coll.insert({_id: 15, expanded: [["key", "value", "offset"]]}));
+ 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: 17, expanded: [{y: "x", x: "y"}]}));
+ assertErrorCode(coll, [{$match: {_id: 17}}, array_to_object_expr], 40393);
+
+ assert.writeOK(coll.insert({_id: 18, expanded: [{k: "missing"}]}));
+ assertErrorCode(coll, [{$match: {_id: 18}}, array_to_object_expr], 40392);
+
+ 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: 20, expanded: [{y: "ignored", k: "item", v: "pear"}]}));
+ 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);
+}());