-
Notifications
You must be signed in to change notification settings - Fork 5.6k
/
Copy pathunwind.js
152 lines (144 loc) · 6.69 KB
/
unwind.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
* Test $unwind with 'includeArrayIndex'.
*/
import {show} from "jstests/libs/golden_test.js";
const coll = db.unwind;
coll.drop();
let docs = [
{_id: 1, a: [{b: {d: 3}, p: 4}, {b: {d: 5}}, 6], z: 7},
{_id: 2, a: [{b: {c: 3, d: 4}, p: 5}, {b: {c: {d: 6}, d: 7}, p: 8}, 9], z: 10},
{_id: 3, a: [{b: {c: [3, {d: 4}], d: 5}, p: 6}, {b: {c: [7, {d: 8}], d: 9}, p: 10}], z: 11},
{_id: 4, a: [{b: [{d: 3}, {d: 4}, 5], p: 6}, {b: [{d: 7}, {d: 8}, 9], p: 10}], z: 11},
{
_id: 5,
a: [
{b: [{c: 3, d: 4}, {c: 5, d: 6}, 7], p: 8},
{b: [{c: 9, d: 10}, {c: 11, d: 12}, 13], p: 14}
],
z: 15
},
{
_id: 6,
a: [
{b: [{c: [3, {d: 4}], d: 5}, {c: [6, {d: 7}], d: 8}, 9], p: 10},
{b: [{c: [11, {d: 12}], d: 13}, {c: [14, {d: 15}], d: 16}, 17], p: 18}
],
z: 19
},
{_id: 7, a: [{b: {d: 3}}, {b: {d: 4}}, 5], j: {p: 7}, z: 8},
{_id: 8, a: [{b: {d: 3}}, {b: {d: 4}}, 5], j: {k: 7, p: 8}, z: 9},
{_id: 9, a: [{b: {d: 3}}, {b: {d: 4}}, 5], j: [], z: 7},
{_id: 10, a: [{b: {d: 3}}, {b: {d: 4}}, 5], j: [{k: 7, p: 8}, {k: 9, p: 10}, 11], z: 7},
{_id: 11, a: [{b: {d: 3}}, {b: {d: 4}}, 5], j: {k: [7, 8], p: 9}, z: 10},
{
_id: 12,
a: [{b: {d: 3}}, {b: {d: 4}}, 5],
j: [{k: [7, 8], p: 9}, {k: [10, 11], p: 12}, 13],
z: 14
},
{_id: 13, a: {b: [{c: {e: 3}, p: 4}, {c: {e: 5}}, 6], y: 7}, z: 7},
{_id: 14, a: {b: [{c: {d: 3, e: 4}, p: 5}, {c: {d: {e: 6}, e: 7}, p: 8}, 9], y: 10}, z: 11},
{
_id: 15,
a: {b: [{c: {d: [3, {e: 4}], e: 5}, p: 6}, {c: {d: [7, {e: 8}], e: 9}, p: 10}], y: 11},
z: 12
},
{
_id: 16,
a: {b: [{c: [{e: 3}, {e: 4}, 5], p: 6}, {c: [{e: 7}, {e: 8}, 9], p: 10}], y: 11},
z: 12
},
{
_id: 17,
a: {
b: [
{c: [{d: 3, e: 4}, {d: 5, e: 6}, 7], p: 8},
{c: [{d: 9, e: 10}, {d: 11, e: 12}, 13], p: 14}
],
y: 15
},
z: 16
},
{
_id: 18,
a: {
b: [
{c: [{d: [3, {e: 4}], e: 5}, {d: [6, {e: 7}], e: 8}, 9], p: 10},
{c: [{d: [11, {e: 12}], e: 13}, {d: [14, {e: 15}], e: 16}, 17], p: 18}
],
y: 19
},
z: 20
},
{_id: 19, a: {b: [{c: {e: 3}, p: 4}, {c: {e: 5}}, 6], y: 7}, j: {p: 8}, z: 9},
{_id: 20, a: {b: [{c: {e: 3}, p: 4}, {c: {e: 5}}, 6], y: 7}, j: {k: 8, p: 9}, z: 10},
{_id: 21, a: {b: [{c: {e: 3}, p: 4}, {c: {e: 5}}, 6], y: 7}, j: [], z: 7},
{
_id: 22,
a: {b: [{c: {e: 3}, p: 4}, {c: {e: 5}}, 6], y: 7},
j: [{k: 7, p: 8}, {k: 9, p: 10}, 11],
z: 7
},
{_id: 23, a: {b: [{c: {e: 3}}, {c: {e: 4}}, 5], y: 6}, j: {k: [7, 8], p: 9}, z: 10},
{
_id: 24,
a: {b: [{c: {e: 3}}, {c: {e: 4}}, 5], y: 6},
j: [{k: [7, 8], p: 9}, {k: [10, 11], p: 12}, 13],
z: 14
},
{_id: 25, a: {b: {c: [{d: 1}, {d: 2}, {e: 3}]}}}
];
let testcases = [
[{$match: {_id: 1}}, {$unwind: {path: "$a"}}],
[{$match: {_id: 1}}, {$unwind: {path: "$a", includeArrayIndex: "j"}}],
[{$match: {_id: 7}}, {$unwind: {path: "$a", includeArrayIndex: "j"}}],
[{$match: {_id: 21}}, {$unwind: {path: "$a", includeArrayIndex: "j"}}],
[{$match: {_id: 22}}, {$unwind: {path: "$a", includeArrayIndex: "j"}}],
[{$match: {_id: 1}}, {$unwind: {path: "$a", includeArrayIndex: "j.k"}}],
[{$match: {_id: 7}}, {$unwind: {path: "$a", includeArrayIndex: "j.k"}}],
[{$match: {_id: 8}}, {$unwind: {path: "$a", includeArrayIndex: "j.k"}}],
[{$match: {_id: 9}}, {$unwind: {path: "$a", includeArrayIndex: "j.k"}}],
[{$match: {_id: 10}}, {$unwind: {path: "$a", includeArrayIndex: "j.k"}}],
[{$match: {_id: 11}}, {$unwind: {path: "$a", includeArrayIndex: "j.k"}}],
[{$match: {_id: 12}}, {$unwind: {path: "$a", includeArrayIndex: "j.k"}}],
[{$match: {_id: 1}}, {$unwind: {path: "$a", includeArrayIndex: "a"}}],
[{$match: {_id: 1}}, {$unwind: {path: "$a", includeArrayIndex: "a.b"}}],
[{$match: {_id: 4}}, {$unwind: {path: "$a", includeArrayIndex: "a.b"}}],
[{$match: {_id: 1}}, {$unwind: {path: "$a", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 2}}, {$unwind: {path: "$a", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 3}}, {$unwind: {path: "$a", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 4}}, {$unwind: {path: "$a", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 5}}, {$unwind: {path: "$a", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 6}}, {$unwind: {path: "$a", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 13}}, {$unwind: {path: "$a.b"}}],
[{$match: {_id: 13}}, {$unwind: {path: "$a.b", includeArrayIndex: "j"}}],
[{$match: {_id: 19}}, {$unwind: {path: "$a.b", includeArrayIndex: "j"}}],
[{$match: {_id: 21}}, {$unwind: {path: "$a.b", includeArrayIndex: "j"}}],
[{$match: {_id: 22}}, {$unwind: {path: "$a.b", includeArrayIndex: "j"}}],
[{$match: {_id: 13}}, {$unwind: {path: "$a.b", includeArrayIndex: "j.k"}}],
[{$match: {_id: 19}}, {$unwind: {path: "$a.b", includeArrayIndex: "j.k"}}],
[{$match: {_id: 20}}, {$unwind: {path: "$a.b", includeArrayIndex: "j.k"}}],
[{$match: {_id: 21}}, {$unwind: {path: "$a.b", includeArrayIndex: "j.k"}}],
[{$match: {_id: 22}}, {$unwind: {path: "$a.b", includeArrayIndex: "j.k"}}],
[{$match: {_id: 23}}, {$unwind: {path: "$a.b", includeArrayIndex: "j.k"}}],
[{$match: {_id: 24}}, {$unwind: {path: "$a.b", includeArrayIndex: "j.k"}}],
[{$match: {_id: 13}}, {$unwind: {path: "$a.b", includeArrayIndex: "a"}}],
[{$match: {_id: 16}}, {$unwind: {path: "$a.b", includeArrayIndex: "a"}}],
[{$match: {_id: 13}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b"}}],
[{$match: {_id: 13}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 16}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c"}}],
[{$match: {_id: 13}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c.d"}}],
[{$match: {_id: 14}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c.d"}}],
[{$match: {_id: 15}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c.d"}}],
[{$match: {_id: 16}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c.d"}}],
[{$match: {_id: 17}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c.d"}}],
[{$match: {_id: 18}}, {$unwind: {path: "$a.b", includeArrayIndex: "a.b.c.d"}}],
[{$match: {_id: 25}}, {$unwind: {path: "$a.b.c", includeArrayIndex: "a.b"}}]
];
coll.insert(docs);
for (let i = 0; i < testcases.length; ++i) {
let pipeline = testcases[i].concat({$project: {x: 0}});
print(`Query ${i}: ${tojsononeline(pipeline)}\n`);
show(coll.aggregate(pipeline));
print("\n");
}