无法将值推送到mongoDB数组

3
嗨,我有一个使用MEAN技术栈的应用程序,其中使用了下面定义的mongoose模型:
appointment.js
var mongoose = require('mongoose');
module.exports = mongoose.model('Appointment', {
appt_date: String,
details: [ {
            appt_time: String,
            patient_id : String,
            patient_name : String,
            contact_no: String,
            doctor_name : String,
            purpose : String
          }
      ]
});

我想生成类似以下的文档:
{
 appt_date: 13/13/2013,
 details: [
    {
        appt_time: 09:00 AM,
        patient_id: 2015/2016,
        patient_name: David John,
        contact_no: 8965741234,
        doctor_name: Albert ,
        purpose: Consultation,

    }
}

当我使用以下的Express JS代码时,无法生成文档:

var Appointment = require('../../models/appointment');
var appointments = new Appointment ({ "appt_date" : req.body.date});
appointments.save();
Appointment.update({ appt_date: req.body.date},
{ 
  $push: {
           'details':  {    
                         appt_time:"09:00 AM",
                         patient_id:"2015/2016",
                         patient_name:"Wilfred",
                         contact_no:"8965741234",
                         doctor_name: "Albert",
                         purpose: "Consultation"
                       }
          }
 },
   {
      upsert:true
   });

执行完以上操作后,我得到的结果如下:
"_id": ObjectId('57b6eefd2b494e802ba146d8'),
"appt_date": "12/20/2014",
"details": [],
"__v": 0

我无法向"details"数组中推送任何数据。我需要的是一个单一的日期条目(appt_date)和多个细节(details数组)。请帮忙解决这个问题。
谢谢。
3个回答

1

save() 之后不需要进行更新,只需在 details 键上使用 push() 方法,然后保存即可。例如:

var Appointment = require('../../models/appointment');
var appointments = new Appointment ({ "appt_date" : req.body.date});
appointments.details.push({    
    appt_time: "09:00 AM",
    patient_id: "2015/2016",
    patient_name: "Wilfred",
    contact_no: "8965741234",
    doctor_name: "Albert",
    purpose: "Consultation"
});
appointments.save(function(err, appointment){
    if (err) handleErr(err);
    console.log(appointment);
});

@ Chridam - 谢谢....执行时,这总是创建一个新文档,对吧?在更新命令中提到的值在第二步中出现。我需要的是 - 步骤1)选择日期 - 这应该添加一个具有appt_date =所选日期的文档。步骤2)将显示一个表单,从中获取诸如appt_time、patient_id等等的详细信息。我不想为每个条目创建一个新文档。一个日期=一个文档,在“详细信息”数组中有多个详细信息。如何实现这一点? - Roger Jacob
@ Chridam - 我需要在选择日期后使用定义的模型创建文档,然后当用户完成信息时,将这些信息推送到“详细信息”数组中。我正在尝试创建一个约会调度程序。因此,当用户选择“日期”并插入一些信息时,以后当用户选择“相同日期”并添加一些信息时,这些信息应该被推送到“详细信息”数组中。 - Roger Jacob
@ Chridam - 我所做的是:在选择日期后,我将日期发送回服务器,并使用代码“var appointments = new Appointment({”appt_date“:req.body.date});”创建文档。同时打开一个模态窗口,提供信息。收到此信息后,我使用其余的代码“Appointment.update({appt_date:req.body.date})”......在此时,所述代码无法在创建的文档上工作。如何纠正这个问题。创建和推送在两个实例中完成。 - Roger Jacob

0

尝试使用这段代码:

var Appointment = require('../../models/appointment');
var appointments = new Appointment();
appointments.appt_date = req.body.date;
appointment.details.push({appt_time:"09:00 AM",patient_id:"2015/2016", patient_name:"Wilfred",contact_no:"8965741234",doctor_name: "Albert",
purpose: "Consultation"});
appointments.save(function(err){
   if(!err)
      console.log("saved")
})

@ Md Nazmul Bilash - 谢谢。我需要在一个实例中创建文档并稍后使用appt_date更新/推送信息到以前创建的文档,即到details数组里。我不想在每次选择日期时都创建新文档。请帮忙解决这个问题… - Roger Jacob
第一次创建文档: Appointment({ "appt_date" : req.body.date});如果您想稍后推送其他信息,则可以使用以下代码: var appointments = newormation later then : Appointent.find({_id : 'Id of appointment'}).exec(function(err,appoinment){ if(appoinment){ appointment.details.push({appt_time:"09:00 AM", patient_id:"2015/2016", patient_name:"Wilfred", contact_no:"8965741234", doctor_name: "Albert", purpose: "Consultation"}); appointments.save(function(err){ if(!err) console.log("saved") }) } }) - Nazmul
是的,我做到了。后来我尝试了以下代码。Appointment.update({ appt_date: req.body.date},{ $push: { 'details': { appt_time:12, patient_id:1025, patient_name:"roger", contact_no:8089, doctor_name: "jestin", purpose: "RCT" } } },{upsert:true});这段代码不会将任何数据推送到“details”数组中。我甚至尝试使用“_id”而不是“appt_date”来查找确切的文档,但失败了。这段代码有什么问题..? - Roger Jacob
我认为它没有保存你的数据。在更新后,你是否调用了save()函数? - Nazmul
在打开模态框的函数内部,我使用了以下代码: var appointments = new Appointment ({ "appt_date" : req.body.date}); 稍后在另一个传递信息(appt_time、name、id等)的函数内部,我使用了以下代码: Appointment.update({ _id: req.body.id}, { $push: { 'details': { appt_time:12, patient_id:1025, patient_name:"roger", contact_no:8089, doctor_name: "jestin", purpose: "RCT" } } },{upsert:true}); 我在函数内部有之前生成的文档的 _id。但是操作失败了。我应该在哪里更正这段代码? - Roger Jacob
你在 push 后保存了代码吗?请调用 .save 函数。如果可能的话,请将您的代码复制到 jsfiddle 上,然后我可以从那里帮助您。但首先请尝试保存数据。 - Nazmul

0

你正在根据日期更新文档,可能存在多个app_date的情况,这种情况会更新多个文档。因此,你需要添加multi:true对象。

Appointment.update({ appt_date: req.body.date},
{ 
 $push: {
       'details':  {    
                     appt_time:"09:00 AM",
                     patient_id:"2015/2016",
                     patient_name:"Wilfred",
                     contact_no:"8965741234",
                     doctor_name: "Albert",
                     purpose: "Consultation"
                   }
      }
},
{multi: true},
 {
  upsert:true
 });

或者您可以通过_id进行更新


@ Muhammad Ali - 谢谢。我需要的是一个单一的文档,其中包含一个单一的appt_date和多个details数组条目。 appt_date在某个实例中生成,我想创建一个符合所述模型的文档。在稍后的实例中,我需要更新此文档,即将信息推送到details数组中。当选择日期时,我不想每次都创建新文档。我需要的是单个日期条目在一个文档中,details数组中有多个信息条目。 - Roger Jacob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接