2017-01-18 118 views
1

我已經在貓鼬的幫助下創建了一個數據庫,現在我試圖用它的引用填充文檔。填充單文檔引用可以正常工作,而填充數組則不行。貓鼬陣列人口

給我找麻煩的模型如下:

任務

var taskSchema = new Schema({ 
    _client: { type: Schema.Types.ObjectId, ref: 'Client', required: true }, 
    link: { type: String, required: true }, 
    reqDate: { type: Date, default: Date.now }, 
    startDate: { type: Date }, 
    extId: { type: String, required: true }, 
    results: [{ type: Schema.Types.ObjectId, ref: 'Result' }] 
}); 
var Task = mongoose.model('Task', taskSchema); 

結果

var resultSchema = new Schema({ 
    _task: { type: Schema.Types.ObjectId, ref: 'Task', required: true }, 
    _module: { type: Schema.Types.ObjectId, ref: 'Module', required: true }, 
    finishDate: { type: Date, required: true }, 
    result: { type: Object, required: true } 
}); 
var Result = mongoose.model('Result', resultSchema); 

我加入結果數據庫用下面的代碼:

let taskPromise = Task.findById(req.params.taskId).exec(); 
let modulePromise = Module.findOne({ name: req.body.module }).exec(); 

// Wait for promises to finish 
Promise.all([taskPromise, modulePromise]) 
    .then(values => { 
     if (values[1]) { 
      // Create new result and add to database 
      let result = new Result({ 
       _task: values[0], 
       _module: values[1], 
       finishDate: Date.now(), 
       result: req.body.result 
      }); 
      result.save(); 

      res.json({ result: 'success' }); 
     } else { 
      // If findOne does not find a result, it resolves the promise instead of rejecting it 
      // Therefore Promise.all is successful and we have to check for errors like this 
      res.json({ error: 'The module is invalid' }); 
     } 
     // findById on the other hand rejects a promise when it does not find a result 
     // That's why we are catching the error here. 
    }).catch(err => res.json({ error: 'The task is invalid' })); 

結果添加了API調用,請求正在事先驗證。

要填充,我使用下面的代碼:

Task.findById('587f48ba009932409cf51626') 
     .populate('results _client').exec(function(err, task) { 
      res.json(task); 
     }); 

不介意有沒有錯誤處理,這只是用於調試的原因,作爲ID被硬編碼藏漢

_client的人口可以正常工作,而results仍然是一個空數組,即使數據庫中充滿了此任務的結果。

我一直在關注documentation,並沒有看到我的代碼有任何區別,所以我不知道我可能會做錯什麼。在這個

思想是極大的讚賞

E/

我使用

Result.find({_task: task}, function(err, result) { 
    console.dir(result); 
}) 

獲得此任務的結果工作完全正常,並授予我需要的所有文件進行測試。我想這需要一個與我仍然無法找到任何錯誤的參考有關的問題。

回答

-1
Task.findById('587f48ba009932409cf51626') 
     .populate('_client') 
     .populate('results') 
     .exec(function(err, task) { 
      res.json(task); 
     }) 
+0

由於貓鼬3.6你不必多次調用填充,這段代碼基本上和我的一樣。 – Marv