100 lines
4.5 KiB
JavaScript
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);
|
|
}());
|