@@ -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,25 @@ 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+ /// it should not accept wrong types for nested document fields 
113+ expectNotType < Filter < PetModel > > ( {  'meta.updatedAt' : 123  } ) ; 
114+ expectNotType < Filter < PetModel > > ( {  'meta.updatedAt' : true  } ) ; 
115+ expectNotType < Filter < PetModel > > ( {  'meta.updatedAt' : 'now'  } ) ; 
116+ expectNotType < Filter < PetModel > > ( {  'meta.deep.nested.level' : '123'  } ) ; 
117+ expectNotType < Filter < PetModel > > ( {  'meta.deep.nested.level' : true  } ) ; 
118+ expectNotType < Filter < PetModel > > ( {  'meta.deep.nested.level' : new  Date ( )  } ) ; 
89119
90120/// it should query __array__ fields by exact match 
91121await  collectionT . find ( {  treats : [ 'kibble' ,  'bone' ]  } ) . toArray ( ) ; 
@@ -227,7 +257,3 @@ await collectionT.find({ playmates: { $elemMatch: { name: 'MrMeow' } } }).toArra
227257expectNotType < Filter < PetModel > > ( {  name : {  $all : [ 'world' ,  'world' ]  }  } ) ; 
228258expectNotType < Filter < PetModel > > ( {  age : {  $elemMatch : [ 1 ,  2 ]  }  } ) ; 
229259expectNotType < 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