2013-04-26 2 views
1

Я пытаюсь несколько раз реплицировать самореферентную модель. Вот моя схема:Mongoose - Ошибка самонаводящей глубины залегания

var TestSchema = new Schema({ 
    title: { type: String }, 
    counter: { type: Number }, 
    children: [ { type: Schema.Types.ObjectId, ref: 'test' } ] 
}); 
var models = { 
    Test: mongoose.model('test', TestSchema) 
}; 

До сих пор эта работа код заполнит все, на один уровень:

models.Test.find().populate('children').exec(function(err, doc) { 
    if (err) 
    res.send(err); 
    else { 
    res.send(doc); 
    }  }); 

Но когда я пытаюсь сделать что-то вроде:

models.Test.find().populate('children').populate('children.children').exec(function(err, doc) { 

или даже:

models.Test.find().populate('children').exec(function(err, doc) { 
    if (err) 
    res.send(err); 
    else { 
    models.Test.populate(doc, 'children.children', function(err, doc) { 
     res.send(doc); 
    }); 
    } 
}); 

Я получаю эту ошибку:

TypeError: Cannot call method 'path' of undefined 
    at search (..../api/node_modules/mongoose/lib/model.js:2059:28) 
    at search (..../api/node_modules/mongoose/lib/model.js:2078:22) 
    at Function._getSchema (..../api/node_modules/mongoose/lib/model.js:2085:5) 
    at populate (..../api/node_modules/mongoose/lib/model.js:1706:22) 
    at Function.Model.populate (..../api/node_modules/mongoose/lib/model.js:1686:5) 
    at Promise.<anonymous> (..../api/api.js:22:19) 
    at Promise.<anonymous> (..../api/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
    at Promise.EventEmitter.emit (events.js:95:17) 
    at Promise.emit (..../api/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
    at Promise.fulfill (..../api/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 

The mongoose 3.6 release notes говорят, что глубокие населяет разрешены с помощью Model.populate, но это дает мне ошибку. Кто-нибудь знает, что происходит?

ответ

0

The Mongoose docs for the Model.populate method утверждает, что вторым параметром должен быть объект options, а не строка.

Вот пример они обеспечивают:

User.findById(id, function (err, user) { 
    var opts = [ 
     { path: 'company', match: { x: 1 }, select: 'name' } 
    , { path: 'notes', options: { limit: 10 }, model: 'override' } 
    ] 

    User.populate(user, opts, function (err, user) { 
    console.log(user); 
    }) 
}) 

Так ваш должен выглядеть примерно так:

models.Test.find().populate('children').exec(function(err, doc) { 
    if (err) 
    res.send(err); 
    else { 
    var opts = [ 
     { path: 'children.children' } 
    ]; 
    models.Test.populate(doc, opts, function(err, doc) { 
     res.send(doc); 
    }); 
    } 
}); 
Смежные вопросы