Files
mongo/jstests/aggregation/expressions/arrayToObject.js
2017-03-07 13:37:21 -05:00

100 lines
4.5 KiB
JavaScript

// 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);
}());