mongo/jstests/aggregation/unwind.js

71 lines
2.5 KiB
JavaScript

// SERVER-8088: test $unwind with a scalar
t = db.agg_unwind;
t.drop();
t.insert({_id: 1});
t.insert({_id: 2, x: null});
t.insert({_id: 3, x: []});
t.insert({_id: 4, x: [1, 2]});
t.insert({_id: 5, x: [3]});
t.insert({_id: 6, x: 4});
var res = t.aggregate([{$unwind: "$x"}, {$sort: {_id: 1}}]).toArray();
assert.eq(4, res.length);
assert.eq([1, 2, 3, 4], res.map(function(z) {
return z.x;
}));
// Test unwinding an empty path
coll = db.agg_unwind_empty_path;
coll.drop();
coll.insert({_id: 1});
coll.insert({_id: 2, "": [1, 2]});
coll.insert({_id: 3, "": {"": [3, 4, 5]}});
assert.throwsWithCode(() => coll.aggregate([{$unwind: {path: "$"}}]).toArray(), 40352);
assert.throwsWithCode(() => coll.aggregate([{$unwind: {path: "$."}}]).toArray(), 40353);
// Test includeArrayIndex
coll = db.agg_unwind_with_index;
coll.drop();
coll.insert({_id: 1});
coll.insert({_id: 2, array: [1, 2]});
coll.insert({_id: 3, obj: {array: [3, 4, 5]}});
coll.insert({_id: 4, obj: {subObj: {array: [6, 7, 8, 9]}}});
assert.eq(
coll.aggregate([{$unwind: {path: "$array", includeArrayIndex: "idx"}}]).toArray(),
[{"_id": 2, "array": 1, "idx": NumberLong(0)}, {"_id": 2, "array": 2, "idx": NumberLong(1)}]);
assert.eq(coll.aggregate([{$unwind: {path: "$array", includeArrayIndex: "array"}}]).toArray(),
[{"_id": 2, "array": NumberLong(0)}, {"_id": 2, "array": NumberLong(1)}]);
assert.eq(coll.aggregate([{$unwind: {path: "$obj.array", includeArrayIndex: "idx"}}]).toArray(), [
{"_id": 3, "obj": {"array": 3}, "idx": NumberLong(0)},
{"_id": 3, "obj": {"array": 4}, "idx": NumberLong(1)},
{"_id": 3, "obj": {"array": 5}, "idx": NumberLong(2)}
]);
assert.eq(coll.aggregate([{$unwind: {path: "$obj.array", includeArrayIndex: "obj"}}]).toArray(), [
{"_id": 3, "obj": NumberLong(0)},
{"_id": 3, "obj": NumberLong(1)},
{"_id": 3, "obj": NumberLong(2)}
]);
assert.eq(
coll.aggregate([{$unwind: {path: "$obj.array", includeArrayIndex: "obj.array"}}]).toArray(), [
{"_id": 3, "obj": {"array": NumberLong(0)}},
{"_id": 3, "obj": {"array": NumberLong(1)}},
{"_id": 3, "obj": {"array": NumberLong(2)}}
]);
assert.eq(coll.aggregate([{$unwind: {path: "$obj.subObj.array", includeArrayIndex: "obj.subObj"}}])
.toArray(),
[
{"_id": 4, "obj": {"subObj": NumberLong(0)}},
{"_id": 4, "obj": {"subObj": NumberLong(1)}},
{"_id": 4, "obj": {"subObj": NumberLong(2)}},
{"_id": 4, "obj": {"subObj": NumberLong(3)}}
]);