-
Type: Task
-
Resolution: Fixed
-
Priority: Major - P3
-
Affects Version/s: None
-
Component/s: None
-
None
-
Query Integration
-
Fully Compatible
-
QI 2023-10-02
> db.ts.aggregate([{$match: {tag: "a"}}, {$project: {f: 1, time: 1, tag: 1}}], {collation: {locale: "en", strength: 1}}); [2] mkbson s13 [_id = s10, f = s11, time = s12, tag = s6] true false [2] block_to_row blocks[s7, s8, s9] vals[s10, s11, s12] [2] ts_bucket_to_cellblock s2 paths[s7 = _id, s8 = f, s9 = time] meta = s6 [1] filter {traverseF(s1, lambda(l1.0) { ((l1.0 ==[s5] s4) ?: false) }, false)} [1] scan s2 s3 none none none none none none lowPriority [s1 = meta] @"2238077b-8893-4b6c-bbb4-21b5f72c55de" true false
Note that in the above example, both s1 and s6 holds the 'meta' field.
> db.ts.aggregate([{$match: {tag: {$in: ["a", "c"]}}}, {$project: {f: 1, time: 1, tt: {$concat: ["$tag", "-", "abc"]}, ss: {$concat: ["$tag", "XYZ"]}}}], {collation: {locale: "en", strength: 1}}); [3] mkbson s15 [_id = s12, f = s13, time = s14, ss = s7, tt = s8] true false [3] block_to_row blocks[s9, s10, s11] vals[s12, s13, s14] [3] ts_bucket_to_cellblock s6 paths[s9 = _id, s10 = f, s11 = time] [2] project [s7 = getField(s6, "ss"), s8 = getField(s6, "tt")] [2] project [s6 = makeBsonObj(MakeObjSpec(drop, [], ["tt", "ss"]), s2, if (typeMatch(s1, 1088ll) ?: true) then null else if isString(s1) then concat(s1, "-abc") else fail(7158201, "$concat supports only strings") , if (typeMatch(s1, 1088ll) ?: true) then null else if isString(s1) then concat(s1, "XYZ") else fail(7158201, "$concat supports only strings") )] [1] filter {traverseF(s1, lambda(l1.0) { isMember(l1.0, s4) }, false)} [1] scan s2 s3 none none none none none none lowPriority [s1 = meta] @"2238077b-8893-4b6c-bbb4-21b5f72c55de" true false
Also we should be able to avoid materialize the temporary BSON object for the computed meta fields.
- depends on
-
SERVER-79697 Add a QuerySolutionNode to lower $_internalUnpackBucket
- Closed
- related to
-
SERVER-83621 Consider adding metaField to UnpackTsBucketNode::providedSorts()
- Open