@@ -15,6 +15,11 @@ const db = client.db('test');
15
15
* Test the generic Filter using collection.find<T>() method
16
16
*/
17
17
18
+ interface HumanModel {
19
+ _id : ObjectId ;
20
+ name : string ;
21
+ }
22
+
18
23
// a collection model for all possible MongoDB BSON types and TypeScript types
19
24
interface PetModel {
20
25
_id : ObjectId ; // ObjectId field
@@ -23,14 +28,28 @@ interface PetModel {
23
28
age : number ; // number field
24
29
type : 'dog' | 'cat' | 'fish' ; // union field
25
30
isCute : boolean ; // boolean field
26
- bestFriend ?: PetModel ; // object field (Embedded/Nested Documents)
31
+ bestFriend ?: HumanModel ; // object field (Embedded/Nested Documents)
27
32
createdAt : Date ; // date field
28
33
treats : string [ ] ; // array of string
29
34
playTimePercent : Decimal128 ; // bson Decimal128 type
30
- readonly friends ?: ReadonlyArray < PetModel > ; // readonly array of objects
31
- playmates ?: PetModel [ ] ; // writable array of objects
35
+ readonly friends ?: ReadonlyArray < HumanModel > ; // readonly array of objects
36
+ playmates ?: HumanModel [ ] ; // writable array of objects
37
+ // Object with multiple nested levels
38
+ meta ?: {
39
+ updatedAt ?: Date ;
40
+ deep ?: {
41
+ nested ?: {
42
+ level ?: number ;
43
+ } ;
44
+ } ;
45
+ } ;
32
46
}
33
47
48
+ const john = {
49
+ _id : new ObjectId ( '577fa2d90c4cc47e31cf4b6a' ) ,
50
+ name : 'John'
51
+ } ;
52
+
34
53
const spot = {
35
54
_id : new ObjectId ( '577fa2d90c4cc47e31cf4b6f' ) ,
36
55
name : 'Spot' ,
@@ -78,14 +97,29 @@ expectNotType<Filter<PetModel>>({ age: [23, 43] });
78
97
79
98
/// it should query __nested document__ fields only by exact match
80
99
// TODO: we currently cannot enforce field order but field order is important for mongo
81
- await collectionT . find ( { bestFriend : spot } ) . toArray ( ) ;
100
+ await collectionT . find ( { bestFriend : john } ) . toArray ( ) ;
82
101
/// nested documents query should contain all required fields
83
- expectNotType < Filter < PetModel > > ( { bestFriend : { family : 'Andersons' } } ) ;
102
+ expectNotType < Filter < PetModel > > ( { bestFriend : { name : 'Andersons' } } ) ;
84
103
/// it should not accept wrong types for nested document fields
85
104
expectNotType < Filter < PetModel > > ( { bestFriend : 21 } ) ;
86
105
expectNotType < Filter < PetModel > > ( { bestFriend : 'Andersons' } ) ;
87
106
expectNotType < Filter < PetModel > > ( { bestFriend : [ spot ] } ) ;
88
- expectNotType < Filter < PetModel > > ( { bestFriend : [ { family : 'Andersons' } ] } ) ;
107
+ expectNotType < Filter < PetModel > > ( { bestFriend : [ { name : 'Andersons' } ] } ) ;
108
+
109
+ /// it should query __nested document__ fields using dot-notation
110
+ collectionT . find ( { 'meta.updatedAt' : new Date ( ) } ) ;
111
+ collectionT . find ( { 'meta.deep.nested.level' : 123 } ) ;
112
+ collectionT . find ( { 'friends.0.name' : 'John' } ) ;
113
+ collectionT . find ( { 'playmates.0.name' : 'John' } ) ;
114
+ /// it should not accept wrong types for nested document fields
115
+ expectNotType < Filter < PetModel > > ( { 'meta.updatedAt' : 123 } ) ;
116
+ expectNotType < Filter < PetModel > > ( { 'meta.updatedAt' : true } ) ;
117
+ expectNotType < Filter < PetModel > > ( { 'meta.updatedAt' : 'now' } ) ;
118
+ expectNotType < Filter < PetModel > > ( { 'meta.deep.nested.level' : '123' } ) ;
119
+ expectNotType < Filter < PetModel > > ( { 'meta.deep.nested.level' : true } ) ;
120
+ expectNotType < Filter < PetModel > > ( { 'meta.deep.nested.level' : new Date ( ) } ) ;
121
+ expectNotType < Filter < PetModel > > ( { 'friends.0.name' : 123 } ) ;
122
+ expectNotType < Filter < PetModel > > ( { 'playmates.0.name' : 123 } ) ;
89
123
90
124
/// it should query __array__ fields by exact match
91
125
await collectionT . find ( { treats : [ 'kibble' , 'bone' ] } ) . toArray ( ) ;
@@ -227,7 +261,3 @@ await collectionT.find({ playmates: { $elemMatch: { name: 'MrMeow' } } }).toArra
227
261
expectNotType < Filter < PetModel > > ( { name : { $all : [ 'world' , 'world' ] } } ) ;
228
262
expectNotType < Filter < PetModel > > ( { age : { $elemMatch : [ 1 , 2 ] } } ) ;
229
263
expectNotType < Filter < PetModel > > ( { type : { $size : 2 } } ) ;
230
-
231
- // dot key case that shows it is assignable even when the referenced key is the wrong type
232
- expectAssignable < Filter < PetModel > > ( { 'bestFriend.name' : 23 } ) ; // using dot notation permits any type for the key
233
- expectNotType < Filter < PetModel > > ( { bestFriend : { name : 23 } } ) ;
0 commit comments