使用 Mongo/Express/Angular/Node 推送到模型中的数组

Posted

技术标签:

【中文标题】使用 Mongo/Express/Angular/Node 推送到模型中的数组【英文标题】:Push to array within a model using Mongo/Express/Angular/Node 【发布时间】:2014-01-28 15:15:00 【问题描述】:

我有一个名为“患者”的模型和一个名为“药物”的模型。每个患者可以服用多种药物。

我正在使用 ng-repeat 循环遍历患者并显示。每个患者都会显示一个包含可用药物列表的选择框。我可以将所选药物的 id 记录到控制台,但似乎无法成功将其推送到模型。

节点模型 >

Patient.model.js

    module.exports = function (mongoose, name) 
        var mongoose = require('mongoose'),
        Schema = mongoose.Schema,
        ObjectId = Schema.ObjectId;

        var schema = mongoose.Schema(
            name: String,
            drugs: [String],
            tests: [String]
        );

        mongoose.model(name, schema);
    ;

Drug.model.js

    module.exports = function (mongoose, name) 
        var mongoose = require('mongoose'),
        Schema = mongoose.Schema,
        ObjectId = Schema.ObjectId;

        var schema = mongoose.Schema(
            name: String
        );

        mongoose.model(name, schema);
    ;

Patient.controller.js

var mongoose = require('mongoose'),
    Patient = mongoose.model('Patient');

exports.create = function (req, res) 
  var patient = new Patient(req.body);
  patient.save(function (err) 
    if (err) 
      res.send(400, err);
     else 
      res.send(patient);
    
  );
;

exports.read = function (req, res) 
  Patient.findById(req.params.id, function (err, patient) 
    if (err) 
      res.send(400, err);
     else if (!patient) 
      res.send(404);
     else 
      res.send(patient);
    
  );
;

exports.update = function (req, res) 
  var id = req.params.id,
      data = req.body;

  delete data._id; // Just in case...

  Patient.findByIdAndUpdate(id, data, function (err) 
    if (err) 
      res.send(400, err);
     else 
      res.send(success: true, msg: 'saved');
    
  );
;

exports.del = function (req, res) 
  var id = req.params.id;

  Patient.findById(id, function (err, patient) 
    if (err) 
      res.send(400, err);
     else if (!patient) 
      res.send(404);
     else 
      patient.remove(function (err) 
        if (err) 
          res.send(400, err);
         else 
          res.send(success: true, msg: 'removed');
        
      );
    
  );
;

exports.search = function (req, res) 
  Patient.find(req.query, function (err, patients) 
    if (err) 
      res.send(400, err);
     else 
      res.send(patients);
    
  );
;

patientController.js

  angular
    .module('dpMean.patient')
    .controller('PatientCtrl', function ($scope, Restangular, $log) 
      'use strict';
      var Patient = Restangular.all('patient');
      Patient.getList()
        .then(function (patients) 
          $scope.patients = patients;
        )
        .catch(function (err) 
          $log.error(err);
        );
      var Drug = Restangular.all('drug');
      Drug.getList()
        .then(function (drugs) 
          $scope.drugs = drugs;
        )
        .catch(function (err) 
          $log.error(err);
        );

        /* $scope.add and $scope.delete live here */

      $scope.select = function(id, pid)
        console.log(id);

        var patientDrugs = Restangular.one("patient", pid);
        var array = patientDrugs;
        console.log(array);
        var newarray = array.push(id);
        var update = 
          drugs: newarray
        
        console.log(patientDrugs);
        patientDrugs.put(update);
      ;
    );

<div>
    <h3>Patients</h3>
    <ul class="unstyled">
      <li class="patient-item" ng-repeat="patient in patients">
        <h4>patient.name</h4>
        <label>Add Drug</label>
        <select ng-options="drug.name for drug in drugs" ng-model="drug" ng-change="select(drug._id, patient._id)">
        </select>
        <ul>
            <li ng-repeat="drug in patient.drugs">
                drug
            </li>
        </ul>
         patient.drugs

        <hr />
        <a ng-click="delete(patient._id)">[Remove Patient]</a>

      </li>
      <li class="patient-item">
        <form ng-submit="add()">
          <input type="text" placeholder="New item..." ng-model="name"/>
          <button type="submit" ng-disabled="posting || !name">Add</button>
        </form>
      </li>
    </ul>
</div>

期望行为:当用户从选择框中选择药物时,所选药物的 id 将被添加到患者.patientID.drugs,这是一个数组。

非常感谢您提供的任何帮助。

【问题讨论】:

patient 数组在patientController.js 中的位置在哪里? 【参考方案1】:

这个

$scope.select = function(id, pid)
  console.log(id);

  var patientDrugs = Restangular.one("patient", pid);
  var array = patientDrugs;
  console.log(array);
  var newarray = array.push(id);
  var update = 
    drugs: newarray
  
  console.log(patientDrugs);
  patientDrugs.put(update);
;

可以缩短为

$scope.select = function(id, pid)
  var patientDrugs = Restangular.one("patient", pid);
  var update = 
    drugs: patientDrugs.push(id)
  
  patientDrugs.put(update);
;

然后立即弹出一个问题,您得到parientDrugs 数组,将ID 推入其中,在您创建的名为update 的对象中,现在您再次将对象推入原始数组。

如果我理解正确,这应该可以。但我不确定

$scope.select = function(id, pid)
  var patientDrugs = Restangular.one("patient", pid);
  patientDrugs.push((drugs: id)); //This line depends on what the patientDrugs object looks like
;

【讨论】:

以上是关于使用 Mongo/Express/Angular/Node 推送到模型中的数组的主要内容,如果未能解决你的问题,请参考以下文章

nodejs入门篇---创建project并具体解释

平均堆栈安装

玩一玩MEAN

部署后如何强制客户端重新加载?

我可以使用 html5 本地存储来存储用户身份验证会话信息吗

测试使用