2016-08-17 87 views
0

是新的MEAN堆棧,並且目前在添加(推送)&更新元素到MongoDB中的嵌套數組時遇到了一些麻煩。我有一個模型,如下所示:無法更新或將數據推送到mongodb數組

module.exports = mongoose.model('Check', { 
    appt_date: String, 
    details: [ 
          { 
           appt_time: String, 
           detail: [ { 
              name : String, 
              doctor_name : String 
             } 
             ] 
          } 
         ] 



}); 

當通過Mongo Shell使用以下代碼時,我可以根據模型創建文檔。

db.check.insert({"appt_time":"10/10/16"}); 
db.check.update({"appt_time":"10/10/16"}, {$push: {"details": {"appt_time":"09:30 AM","detail":[]}}},{upsert:true}); 
db.check.update({"appt_time":"10/10/16","details.appt_time":"09:30 AM"}, {$push: {"details.$.detail": {"name":"roger","doctor":"timmy"}}},{upsert: true}); 

控制器如下:

var mongoose = require('mongoose'); 
var check = require('../../models/check'); 


module.exports.addAppointment = function (req, res){ 
console.log("time = " + req.body.appt_time); 
console.log("date = " + req.body.appt_date); 
var checker = new check ({ appt_date: req.body.appt_date });     
checker.save(); 
check.update({"appt_date":req.body.appt_time}, {$push: {"details": {"appt_time":req.body.appt_time,"detail":[]}}},{upsert:true}); 
check.update({"appt_date":req.body.appt_date,"details.appt_time":"req.body.appt_time}, {$push: {"details.$.detail": {"name":"roger","doctor":"timmy"}}},{upsert: true}); 
res.json(res.body); 
} 

上面的代碼只是增加了一個文檔給出一個日期 「25/01/2000」

"_id": ObjectId('57b49d6b9835c0cc26312e21'), 
"appt_date": "25/01/2000", 
"details": [], 
"__v": 0 

我在什麼需要的是 - 一個日期條目,多個時間條目以及相應的細節

{ 
"_id": ObjectId('57b4911cf9e57c0421d1efda'), 
"appt_date": "10/10/2016", 
"details": [ 
    { 
     "appt_time": "09:30 AM", 
     "detail": [ 
      { 
       "name": "roger", 
       "doctor": "timmy" 
      } 
     ] 
    }, 
    { 
     "appt_time": "10:30 AM", 
     "detail": [ 
      { 
       "name": "david", 
       "doctor": "james" 
      } 
     ] 
    } 
    ] 
} 

我無法從此陣列執行推送,更新或讀取操作。如果沒有解決這個問題,我無法進一步完成主項目。如果這不是實施模型/數據的正確方法,請告知。所以請幫我解決這個問題。如果問題不明確,我可以實時向您展示這些內容。

感謝所有... :)

回答

0

除了插入一個簡單的文檔,然後做更新添加更多細節,你第一次嘗試組建整個文檔,然後在其上做插入的?例如,而不是這些行:

var checker = new check ({ appt_date: req.body.appt_date });     
checker.save(); 
check.update({"appt_date":req.body.appt_time}, {$push: {"details": {"appt_time":req.body.appt_time,"detail":[]}}},{upsert:true}); 
check.update({"appt_date":req.body.appt_date,"details.appt_time":"req.body.appt_time}, {$push: {"details.$.detail": {"name":"roger","doctor":"timmy"}}},{upsert: true}); 

你可以做這樣的事情,而不是:

var draft_check = { 
    "appt_date" : req.body.appt_date, 
    "details" : [ 
    { 
     "appt_time":req.body.appt_time, 
     "detail" : [ 
     { 
      "name" : "roger", 
      "doctor":"timmy" 
     } 
     ] 
    } 
}; 
new check (draft_check).save(); 

這種做法可以使客戶端上的代碼更清潔,減少前往的數你需要做的數據庫。

+0

謝謝,這是有效的。但我怎麼能實現以下目標: 1)假設我添加appt_date:18/08/2016 2)我公司提供appt_time 09:30 AM,名稱:羅傑,博士大衛 //這會插入一個新的文檔按該模型。 我應該怎麼做添加新條目「」細節」陣列,即另一個appt_time +名字+醫生嗎?上面的代碼創建一個新文檔時提供的數據每次。 我需要的是一個單一的日期輸入,多時間和詳情進入..我怎樣才能做到這一點?? –

+0

@RogerJacob如果你知道值進入第二個元素中的「詳細信息」陣列中,當你創建新的「檢查」的文件,可以將其包含在最初的「檢查」的定義,類似於上面,但如果你是問有關使以後更新現有檢查的文件,這是一個單獨的問題,我認爲。 –

相關問題