2016-08-17 59 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如果你知道值进入第二个元素中的“详细信息”阵列中,当你创建新的“检查”的文件,可以将其包含在最初的“检查”的定义,类似于上面,但如果你是问有关使以后更新现有检查的文件,这是一个单独的问题,我认为。 –

相关问题