我正在尝试填充我的模型,看起来像:
var Org = new mongoose.Schema({
_id: {type: String, unique:true}, //this will be the org code
name: String,
level: String,
children: [{type: String, ref: 'Org'}]
});
//Orgs have children orgs, which themselves can have children orgs at N levels
给定一个Org,我想填充它的子节点,再填充它的子节点,以此类推。我可以这样完成N = 2个关卡:
req.Model.findOne({_id: id}).populate('children').exec(function(err, doc){
if (err){
return next(err);
}
req.Model.populate(doc, {path: 'children.children'}, function(err, doc){
if(err){
return next(err);
}
return res.json(doc);
});
});
几个小时以来,我一直在尝试使用承诺来完成上述任务,即使在N=2时也是如此。我认为对于N = *的级别,用承诺来做会更干净,猫鼬有一个内置的实现。
req.Model.findOne({_id: id}).populate('children').exec()
.then(function (doc){
if(!treeView) {
return doc;
}
return req.Model.populate(doc, {path: 'children.children'});
})
.then(function (doc){
return res.json(doc);
},function(err){
return next(err);
});
// treeView is a query string that lets me know that I need to populate the refs
我认为它应该是这样工作的:
- exec()返回一个promise,我在第一次调用then()时开始处理它
- 如果treeView为false,我返回doc,这被视为原始承诺的解析,因此第二个then()处理程序被调用。这种情况确实会发生。
- 如果treeView是true,调用Model。populate返回另一个promise,它也将在第二次调用then()时处理。
{
"status": "error",
"serverTimestamp": "2014-07-24T18:23:02.974Z",
"message": ""function" == "undefined""
}
我知道它到达了第二个then()的错误处理程序,因为我已经注销到控制台进行验证,但我不知道为什么会发生这种情况。一旦我可以让它工作,我将尝试使它为N=*级别工作,我想这将涉及递归地创建更多的承诺。我在这里看到了许多相关的问题,但不是我所需要的。
非常感谢任何帮助。
我能够在MongooseJS v4.1中使用从Mongoose模型返回的Mongoose承诺使嵌套子文档填充工作。无需使用其他承诺库。
var fuelOrderId = req.params.fuelOrderId;
fuelOrderModel.findById(fuelOrderId).populate('aircraftId')
.then(function(order){
return fuelOrderModel.populate(order,
{path: 'aircraftId.aircraftContacts',
model: 'aircraftContactModel'});
})
.then(function(result){
res.json({
fuelOrder: result,
status: 1
});
},function(err){
console.error(err);
res.json({err: err, status: 0});
})
Edit考虑使用.catch()
而不是第二个错误函数。mpromise现在支持.catch()
似乎找到了一个解决方案。
Q.ninvoke(doc, 'populate',{path: children.children})
.then(function(doc){
return res.json(doc);
},function(err) {
return next(err);
});
对我来说奇怪的是我需要使用猫鼬文档。而不是Model.populate(doc..),根据文档,它的行为应该非常相似,除非返回一个promise。这是我必须使用Q promise api的一个原因,因为Document。populate不会像Model那样返回一个promise。填充。我找不到莫德尔。填充工作没有一个常规的节点样式回调,但这个解决方案做了我需要的。至于N=*层,我只是递归地调用Q.ninvoke,只要我需要,扩展路径,我可以填充多少层深度,我想要。