@@ -1179,4 +1179,64 @@ describe('Map', function() {
1179
1179
doc1 = await Test . findOne ( { _id : doc1 . _id } ) . lean ( ) ;
1180
1180
assert . deepStrictEqual ( doc1 . test_map , { key1 : [ ] } ) ;
1181
1181
} ) ;
1182
+
1183
+ it ( 'handles modifying array in map of primitives (gh-15350)' , async function ( ) {
1184
+ const DocSchema = new mongoose . Schema ( {
1185
+ map : {
1186
+ type : Map ,
1187
+ of : [ { type : Number } ] ,
1188
+ default : new Map ( )
1189
+ }
1190
+ } ) ;
1191
+ const Doc = db . model ( 'Test' , DocSchema ) ;
1192
+
1193
+ const doc = await Doc . create ( { } ) ;
1194
+ assert . ok ( doc . map instanceof Map ) ;
1195
+ assert . equal ( doc . map . size , 0 ) ;
1196
+
1197
+ doc . map . set ( 'key' , [ 1 , 2 ] ) ;
1198
+ await doc . save ( ) ;
1199
+ assert . deepEqual ( Array . from ( doc . map . get ( 'key' ) ) , [ 1 , 2 ] ) ;
1200
+
1201
+ const list = doc . map . get ( 'key' ) ;
1202
+ list . push ( 3 ) ;
1203
+ assert . deepStrictEqual ( doc . getChanges ( ) . $push , { 'map.key' : { $each : [ 3 ] } } ) ;
1204
+ await doc . save ( ) ;
1205
+
1206
+ const fromDb = await Doc . findById ( doc . _id ) ;
1207
+ assert . deepEqual ( Array . from ( fromDb . map . get ( 'key' ) ) , [ 1 , 2 , 3 ] ) ;
1208
+ } ) ;
1209
+
1210
+ it ( 'handles maps of maps of numbers (gh-15350)' , async function ( ) {
1211
+ const DocSchema = new mongoose . Schema ( {
1212
+ map : {
1213
+ type : Map ,
1214
+ of : {
1215
+ type : Map ,
1216
+ of : Number
1217
+ } ,
1218
+ default : new Map ( )
1219
+ }
1220
+ } ) ;
1221
+ const Doc = db . model ( 'Test' , DocSchema ) ;
1222
+
1223
+ const doc = await Doc . create ( { } ) ;
1224
+ assert . ok ( doc . map instanceof Map ) ;
1225
+ assert . equal ( doc . map . size , 0 ) ;
1226
+
1227
+ const innerMap = new Map ( ) ;
1228
+ innerMap . set ( 'inner' , 42 ) ;
1229
+ doc . map . set ( 'outer' , innerMap ) ;
1230
+ await doc . save ( ) ;
1231
+
1232
+ assert . equal ( doc . map . get ( 'outer' ) . get ( 'inner' ) , 42 ) ;
1233
+
1234
+ doc . map . get ( 'outer' ) . set ( 'inner2' , 43 ) ;
1235
+ assert . deepStrictEqual ( doc . getChanges ( ) , { $set : { 'map.outer.inner2' : 43 } } ) ;
1236
+ await doc . save ( ) ;
1237
+
1238
+ const fromDb = await Doc . findById ( doc . _id ) ;
1239
+ assert . equal ( fromDb . map . get ( 'outer' ) . get ( 'inner' ) , 42 ) ;
1240
+ assert . equal ( fromDb . map . get ( 'outer' ) . get ( 'inner2' ) , 43 ) ;
1241
+ } ) ;
1182
1242
} ) ;
0 commit comments