diff options
author | Wan Bachtiar <sindbach@gmail.com> | 2017-01-23 23:59:56 +1100 |
---|---|---|
committer | Tess Avitabile <tess.avitabile@mongodb.com> | 2017-03-28 17:08:28 -0400 |
commit | e3ecb183d761c9e85ee2c6838e19a39f4af8fb40 (patch) | |
tree | a7761d01f8030931db07f9ba7530ffa20754a470 /jstests/aggregation | |
parent | c7eed05b0a58b265bb65914d4a55dfb2a95d4127 (diff) | |
download | mongo-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.js | 99 |
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); +}()); |