@@ -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' ,
@@ -82,14 +101,29 @@ expectNotType<Filter<PetModel>>({ age: [23, 43] });
82
101
83
102
/// it should query __nested document__ fields only by exact match
84
103
// TODO: we currently cannot enforce field order but field order is important for mongo
85
- await collectionT . find ( { bestFriend : spot } ) . toArray ( ) ;
104
+ await collectionT . find ( { bestFriend : john } ) . toArray ( ) ;
86
105
/// nested documents query should contain all required fields
87
- expectNotType < Filter < PetModel > > ( { bestFriend : { family : 'Andersons' } } ) ;
106
+ expectNotType < Filter < PetModel > > ( { bestFriend : { name : 'Andersons' } } ) ;
88
107
/// it should not accept wrong types for nested document fields
89
108
expectNotType < Filter < PetModel > > ( { bestFriend : 21 } ) ;
90
109
expectNotType < Filter < PetModel > > ( { bestFriend : 'Andersons' } ) ;
91
110
expectNotType < Filter < PetModel > > ( { bestFriend : [ spot ] } ) ;
92
- expectNotType < Filter < PetModel > > ( { bestFriend : [ { family : 'Andersons' } ] } ) ;
111
+ expectNotType < Filter < PetModel > > ( { bestFriend : [ { name : 'Andersons' } ] } ) ;
112
+
113
+ /// it should query __nested document__ fields using dot-notation
114
+ collectionT . find ( { 'meta.updatedAt' : new Date ( ) } ) ;
115
+ collectionT . find ( { 'meta.deep.nested.level' : 123 } ) ;
116
+ collectionT . find ( { 'friends.0.name' : 'John' } ) ;
117
+ collectionT . find ( { 'playmates.0.name' : 'John' } ) ;
118
+ /// it should not accept wrong types for nested document fields
119
+ expectNotType < Filter < PetModel > > ( { 'meta.updatedAt' : 123 } ) ;
120
+ expectNotType < Filter < PetModel > > ( { 'meta.updatedAt' : true } ) ;
121
+ expectNotType < Filter < PetModel > > ( { 'meta.updatedAt' : 'now' } ) ;
122
+ expectNotType < Filter < PetModel > > ( { 'meta.deep.nested.level' : '123' } ) ;
123
+ expectNotType < Filter < PetModel > > ( { 'meta.deep.nested.level' : true } ) ;
124
+ expectNotType < Filter < PetModel > > ( { 'meta.deep.nested.level' : new Date ( ) } ) ;
125
+ expectNotType < Filter < PetModel > > ( { 'friends.0.name' : 123 } ) ;
126
+ expectNotType < Filter < PetModel > > ( { 'playmates.0.name' : 123 } ) ;
93
127
94
128
/// it should query __array__ fields by exact match
95
129
await collectionT . find ( { treats : [ 'kibble' , 'bone' ] } ) . toArray ( ) ;
@@ -231,7 +265,3 @@ await collectionT.find({ playmates: { $elemMatch: { name: 'MrMeow' } } }).toArra
231
265
expectNotType < Filter < PetModel > > ( { name : { $all : [ 'world' , 'world' ] } } ) ;
232
266
expectNotType < Filter < PetModel > > ( { age : { $elemMatch : [ 1 , 2 ] } } ) ;
233
267
expectNotType < Filter < PetModel > > ( { type : { $size : 2 } } ) ;
234
-
235
- // dot key case that shows it is assignable even when the referenced key is the wrong type
236
- expectAssignable < Filter < PetModel > > ( { 'bestFriend.name' : 23 } ) ; // using dot notation permits any type for the key
237
- expectNotType < Filter < PetModel > > ( { bestFriend : { name : 23 } } ) ;
0 commit comments