【问题标题】:Can't push values to mongoDB array无法将值推送到 mongoDB 数组
【发布时间】:2016-12-26 13:42:18
【问题描述】:

您好,我有一个 MEAN 堆栈应用程序,它使用如下定义的猫鼬模型:

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

我无法将任何数据推送到“详细信息”数组。我需要的是单个日期条目(appt_date),多个详细信息(详细信息数组)。请帮忙解决这个问题。

谢谢。

【问题讨论】:

    标签: arrays node.js mongodb express mean-stack


    【解决方案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 - 谢谢....在执行时,这总是会创建一个新文档,对吗? update 命令中提到的值是第二步。我需要的是 - 步骤 1)选择一个日期 - 这应该添加一个带有 appt_date = 选定日期的文档。步骤 2) 将显示一个表单,其中 appt_time、patient_id 等详细信息的来源。我不想为每个条目创建一个新文档。一个日期 = 一个文档,“详细信息”数组中的多个详细信息。如何实现?
    • @ Chridam - 我需要在使用定义的模型选择日期时创建一个文档,稍后当用户完成信息时,将这些信息推送到“详细信息”数组中。我正在尝试创建约会计划程序。因此,当用户选择“日期”并插入一些信息时,以及稍后当用户选择“相同日期”并添加一些信息时,这些信息应该被推送到“详细信息”数组中..
    • @ Chridam - 我所做的是:在选择日期时,我将日期发送回服务器并使用代码'var约会=新约会({“appt_date”:req.body.date });'创建文档。在同一情况下,将向提供信息的地方打开一个模式。收到此信息后,我使用了其余代码“Appointment.update({appt_date: req.body.date})”.......在这种情况下,上述代码对创建的文档不起作用。我怎样才能纠正这个问题。创建和推送在两个实例中完成。
    【解决方案2】:

    试试这个代码:

    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 数组中。我不想每次选择日期时都创建一个新文档。请帮忙解决这个问题...
    • 第一次创建文档:约会({ "appt_date" : req.body.date});如果您想稍后推送其他 inf var 约会 = newormation 则: Apppointent.find({_id : 'Id of Append'}).exec(function(err,appoinment){ if(appoinment){ointment.details.push({ appt_time:"09:00 AM", patient_id:"2015/2016", patient_name:"Wilfred", contact_no:"8965741234", doctor_name: "Albert", purpose: "Consultation"});约会.save(function(err ){ if(!err) console.log("saved") }) } })
    • 是的,我做到了。后来我尝试了以下代码。 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 来查找确切的文档,但失败了。这段代码有什么问题..?
    • 我认为它没有保存您的数据。更新后你调用 save() 了吗??
    • 在打开模式的函数内部,我使用了以下代码:var appointments = new Appointment ({ "appt_date" : req.body.date}); 稍后在另一个传递信息(appt_time、name、id 等)的函数中,我使用了以下代码:@987654328 @我在函数里面有之前生成的文档的_id。但操作失败。我应该在哪里更正这个代码
    【解决方案3】:

    您正在根据日期更新文档,并且可能有超过 1 个 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 数组中的多个信息条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2016-11-17
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2019-07-20
    • 2020-10-23
    相关资源
    最近更新 更多