@@ -318,5 +318,43 @@ describe('model', function() {
318318
319319 assert . ok ( ! hydrated . stories [ 1 ] . article ) ;
320320 } ) ;
321+
322+ it ( 'applies virtuals to doubly-nested arrays (gh-15956)' , function ( ) {
323+ const innerSchema = new Schema ( { name : String } ) ;
324+ innerSchema . virtual ( 'computed' ) ;
325+
326+ const schema = new Schema ( {
327+ matrix : [ [ innerSchema ] ]
328+ } ) ;
329+
330+ const Model = db . model ( 'Test3' , schema ) ;
331+
332+ const raw = {
333+ _id : new mongoose . Types . ObjectId ( ) ,
334+ matrix : [
335+ [
336+ { name : 'a' , computed : 'virtual-a' } ,
337+ { name : 'b' , computed : 'virtual-b' }
338+ ] ,
339+ [
340+ { name : 'c' , computed : 'virtual-c' }
341+ ]
342+ ]
343+ } ;
344+
345+ const doc = Model . hydrate ( raw , null , { virtuals : true } ) ;
346+
347+ assert . strictEqual ( doc . matrix [ 0 ] [ 0 ] . name , 'a' ) ;
348+ assert . strictEqual ( doc . matrix [ 0 ] [ 0 ] . computed , 'virtual-a' ) ;
349+ assert . strictEqual ( doc . matrix [ 0 ] [ 1 ] . name , 'b' ) ;
350+ assert . strictEqual ( doc . matrix [ 0 ] [ 1 ] . computed , 'virtual-b' ) ;
351+ assert . strictEqual ( doc . matrix [ 1 ] [ 0 ] . name , 'c' ) ;
352+ assert . strictEqual ( doc . matrix [ 1 ] [ 0 ] . computed , 'virtual-c' ) ;
353+
354+ // Test without virtuals option - should not apply virtuals
355+ const doc2 = Model . hydrate ( raw , null ) ;
356+ assert . strictEqual ( doc2 . matrix [ 0 ] [ 0 ] . name , 'a' ) ;
357+ assert . strictEqual ( doc2 . matrix [ 0 ] [ 0 ] . computed , undefined ) ;
358+ } ) ;
321359 } ) ;
322360} ) ;
0 commit comments