2016-08-17 6 views
0

へのデータの更新またはプッシュができません。現在、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 

として指定した日付のドキュメントが追加されますこれが必要です - 1つの日付エントリ、複数のタイムエントリと対応する詳細

{ 
"_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 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(); 

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}); 

あなたは、代わりにこのような何かを行うことができますデータベースを作成する必要があります。

+0

ありがとうございます。しかし、どうすればいいのですか? 1)appt_dateを追加するとします:18/08/2016 2)appt_time:09:30 AM、名前:Roger、doctor:David //これにより、モデル。 上記のコードは、データが提供されるたびに新しい文書を作成します。 私が必要とするのは、1つの日付エントリです、複数の時間と詳細エントリ..これを達成するにはどうすればいいですか? –

+0

@RogerJacob新しい「チェック」ドキュメントを作成するときに、「詳細」配列の2番目の要素に入る値がわかっている場合は、上記のような最初の "check"定義では、既存のチェック文書を後で更新するように頼んでいる場合、それは別の質問です。 –