@@ -15,6 +15,11 @@ const db = client.db('test');
1515 * Test the generic Filter using collection.find<T>() method
1616 */
1717
18+ interface HumanModel {
19+ _id : ObjectId ;
20+ name : string ;
21+ }
22+
1823// a collection model for all possible MongoDB BSON types and TypeScript types
1924interface PetModel {
2025 _id : ObjectId ; // ObjectId field
@@ -23,14 +28,28 @@ interface PetModel {
2328 age : number ; // number field
2429 type : 'dog' | 'cat' | 'fish' ; // union field
2530 isCute : boolean ; // boolean field
26- bestFriend ?: PetModel ; // object field (Embedded/Nested Documents)
31+ bestFriend ?: HumanModel ; // object field (Embedded/Nested Documents)
2732 createdAt : Date ; // date field
2833 treats : string [ ] ; // array of string
2934 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+ } ;
3246}
3347
48+ const john = {
49+ _id : new ObjectId ( '577fa2d90c4cc47e31cf4b6a' ) ,
50+ name : 'John'
51+ } ;
52+
3453const spot = {
3554 _id : new ObjectId ( '577fa2d90c4cc47e31cf4b6f' ) ,
3655 name : 'Spot' ,
@@ -78,14 +97,29 @@ expectNotType<Filter<PetModel>>({ age: [23, 43] });
7897
7998/// it should query __nested document__ fields only by exact match
8099// 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 ( ) ;
82101/// nested documents query should contain all required fields
83- expectNotType < Filter < PetModel > > ( { bestFriend : { family : 'Andersons' } } ) ;
102+ expectNotType < Filter < PetModel > > ( { bestFriend : { name : 'Andersons' } } ) ;
84103/// it should not accept wrong types for nested document fields
85104expectNotType < Filter < PetModel > > ( { bestFriend : 21 } ) ;
86105expectNotType < Filter < PetModel > > ( { bestFriend : 'Andersons' } ) ;
87106expectNotType < 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 } ) ;
89123
90124/// it should query __array__ fields by exact match
91125await collectionT . find ( { treats : [ 'kibble' , 'bone' ] } ) . toArray ( ) ;
@@ -227,7 +261,3 @@ await collectionT.find({ playmates: { $elemMatch: { name: 'MrMeow' } } }).toArra
227261expectNotType < Filter < PetModel > > ( { name : { $all : [ 'world' , 'world' ] } } ) ;
228262expectNotType < Filter < PetModel > > ( { age : { $elemMatch : [ 1 , 2 ] } } ) ;
229263expectNotType < 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