2016-08-17 2 views
0

Я новичок в стеке MEAN и в настоящее время сталкиваюсь с некоторыми проблемами при добавлении (нажатии) & обновления элементов для вложенных массивов в mongodb. У меня есть модель, как показано ниже:Невозможно обновить или перетащить данные в массив mongodb

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



}); 

При использовании следующих кодов с помощью Монго 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" 
      } 
     ] 
    } 
    ] 
} 

Я не могу выполнять операции push или update или read из этого массива. Я не могу взять свой основной проект дальше, не решая этого. Если это не правильный способ реализации модели/данных, пожалуйста, сообщите. Поэтому, пожалуйста, помогите мне решить это. Если вопрос не ясен, я могу показать вам материал в режиме реального времени.

Спасибо всем ... :)

ответ

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, имя: Roger, doctor: David // Это вставляет новый документ в соответствии с модель. Что нужно сделать, чтобы добавить новую запись в массив «" details, т.е. другое appt_time + name + doctor? Вышеприведенный код создает новый документ каждый раз, когда предоставляются данные. Мне нужна только одна запись даты , многократное время и подробный ввод .. Как я могу это достичь? –

+0

@RogerJacob Если вы знаете значения, чтобы перейти во второй элемент в массиве «details», когда вы создаете новый «проверочный» документ, его можно включить в начальном определении «проверка», как описано выше. Но если вы спрашиваете о том, чтобы сделать более позднее обновление существующего документа проверки, это отдельный вопрос, который я думаю. –

Смежные вопросы