@@ -2182,12 +2182,7 @@ var excludeIdReg = /\s?-_id\s?/,
2182
2182
excludeIdRegGlobal = / \s ? - _ i d \s ? / g;
2183
2183
2184
2184
function populate ( model , docs , options , cb ) {
2185
- var schema = model . _getSchema ( options . path ) ,
2186
- modelsMap , rawIds ;
2187
-
2188
- if ( schema && schema . caster ) {
2189
- schema = schema . caster ;
2190
- }
2185
+ var modelsMap , rawIds ;
2191
2186
2192
2187
// normalize single / multiple docs passed
2193
2188
if ( ! Array . isArray ( docs ) ) {
@@ -2198,7 +2193,7 @@ function populate(model, docs, options, cb) {
2198
2193
return cb ( ) ;
2199
2194
}
2200
2195
2201
- modelsMap = getModelsMapForPopulate ( model , schema , docs , options ) ;
2196
+ modelsMap = getModelsMapForPopulate ( model , docs , options ) ;
2202
2197
rawIds = getIdsForAndAddIdsInMapPopulate ( modelsMap ) ;
2203
2198
2204
2199
var i , len = modelsMap . length ,
@@ -2294,65 +2289,91 @@ function populate(model, docs, options, cb) {
2294
2289
}
2295
2290
}
2296
2291
2297
- function getModelsMapForPopulate ( model , schema , docs , options ) {
2292
+ function getModelsMapForPopulate ( model , docs , options ) {
2298
2293
var i , doc , len = docs . length ,
2299
- available = { } , map = [ ] ,
2300
- refPath = schema && schema . options && schema . options . refPath ,
2301
- Model , currentOptions , modelNames , modelName ;
2294
+ available = { } ,
2295
+ map = [ ] ,
2296
+ modelNameFromQuery = options . model && options . model . modelName || options . model ,
2297
+ schema , refPath , Model , currentOptions , modelNames , modelName , discriminatorKey , modelForFindSchema ;
2302
2298
2303
- if ( refPath ) {
2304
- for ( i = 0 ; i < len ; i ++ ) {
2305
- doc = docs [ i ] ;
2299
+ schema = model . _getSchema ( options . path ) ;
2300
+
2301
+ if ( schema && schema . caster ) {
2302
+ schema = schema . caster ;
2303
+ }
2304
+
2305
+ if ( ! schema && model . discriminators ) {
2306
+ discriminatorKey = model . schema . discriminatorMapping . key
2307
+ }
2308
+
2309
+ refPath = schema && schema . options && schema . options . refPath ;
2310
+
2311
+ for ( i = 0 ; i < len ; i ++ ) {
2312
+ doc = docs [ i ] ;
2313
+
2314
+ if ( refPath ) {
2306
2315
modelNames = utils . getValue ( refPath , doc ) ;
2316
+ } else {
2317
+ if ( ! modelNameFromQuery ) {
2318
+ var schemaForCurrentDoc ;
2307
2319
2308
- if ( ! modelNames )
2309
- continue ;
2320
+ if ( ! schema && discriminatorKey ) {
2321
+ modelForFindSchema = utils . getValue ( discriminatorKey , doc ) ;
2310
2322
2311
- if ( ! Array . isArray ( modelNames ) ) {
2312
- modelNames = [ modelNames ] ;
2313
- }
2323
+ if ( modelForFindSchema ) {
2324
+ schemaForCurrentDoc = model . db . model ( modelForFindSchema ) . _getSchema ( options . path ) ;
2314
2325
2315
- var k = modelNames . length ;
2316
- while ( k -- ) {
2317
- modelName = modelNames [ k ] ;
2318
- if ( ! available [ modelName ] ) {
2319
- Model = model . db . model ( modelName ) ;
2320
- currentOptions = {
2321
- model : Model
2322
- } ;
2323
-
2324
- utils . merge ( currentOptions , options ) ;
2325
-
2326
- available [ modelName ] = {
2327
- Model : Model ,
2328
- options : currentOptions ,
2329
- docs : [ doc ] ,
2330
- ids : [ ]
2331
- } ;
2332
- map . push ( available [ modelName ] ) ;
2326
+ if ( schema && schema . caster ) {
2327
+ schema = schema . caster ;
2328
+ }
2329
+ }
2333
2330
} else {
2334
- available [ modelName ] . docs . push ( doc ) ;
2331
+ schemaForCurrentDoc = schema ;
2335
2332
}
2336
2333
2334
+ modelNames = [
2335
+ schemaForCurrentDoc && schemaForCurrentDoc . options && schemaForCurrentDoc . options . ref // declared in schema
2336
+ || model . modelName // an ad-hoc structure
2337
+ ]
2338
+ } else {
2339
+ modelNames = [ modelNameFromQuery ] ; // query options
2337
2340
}
2338
2341
}
2339
2342
2340
- } else {
2343
+ if ( ! modelNames )
2344
+ continue ;
2341
2345
2342
- // model name for the populate query
2343
- modelName = options . model && options . model . modelName || options . model // query options
2344
- || schema && schema . options && schema . options . ref // declared in schema
2345
- || model . modelName ; // an ad-hoc structure
2346
+ if ( ! Array . isArray ( modelNames ) ) {
2347
+ modelNames = [ modelNames ] ;
2348
+ }
2346
2349
2347
- Model = model . db . model ( modelName ) ;
2348
- options . model = Model ;
2350
+ var k = modelNames . length ;
2351
+ while ( k -- ) {
2352
+ modelName = modelNames [ k ] ;
2353
+ if ( ! available [ modelName ] ) {
2354
+ Model = model . db . model ( modelName ) ;
2355
+ currentOptions = {
2356
+ model : Model
2357
+ } ;
2358
+
2359
+ if ( schema && ! discriminatorKey ) {
2360
+ options . model = Model ;
2361
+ }
2349
2362
2350
- map = [ {
2351
- Model : Model ,
2352
- options : options ,
2353
- docs : docs ,
2354
- ids : [ ]
2355
- } ] ;
2363
+ utils . merge ( currentOptions , options ) ;
2364
+
2365
+ available [ modelName ] = {
2366
+ Model : Model ,
2367
+ options : currentOptions ,
2368
+ docs : [ doc ] ,
2369
+ ids : [ ]
2370
+ } ;
2371
+ map . push ( available [ modelName ] ) ;
2372
+ } else {
2373
+ available [ modelName ] . docs . push ( doc ) ;
2374
+ }
2375
+
2376
+ }
2356
2377
}
2357
2378
2358
2379
return map ;
0 commit comments