javascript - 正确保存数据到mongoDB

标签 javascript arrays angularjs mongodb

有 Angular 中的应用程序。不明白如何正确保存数据。

这是我的 API 的一部分:

.post('/type/add', function(req, res){
   var type = new NewType({
      type: req.body.type,
      subtype: req.body.subtype,
   });
   type.save(function(err, newTypeOne){
      if(err){
         res.send(err);
         return;
      }
      res.json({message: "New type Created!"});
   });
})

这是我的 mongodb 架构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Type = new Schema({
    type: String,
    subtype: String
});
module.exports = mongoose.model('NewType', Type);

这是我的 Controller :

.controller('AddTypeController', ['CreateType', 'AllType', '$location', function(CreateType, AllType, $location){
   vm = this;
   vm.createType = function(){
     vm.message = '';
     CreateType.create(vm.typeData)
       .success(function(data){
       vm.typeData = '';
       vm.message = data.message;
       $location.path('/type')
       });
   };
   AllType.getAll().success(function(data){
      vm.types = data;
   });
}])

这是我的服务:

angular.module('typeService', [])
.factory('AllType', function($http){
   var typeFactory = {};
   typeFactory.getAll = function(){
      return $http.get('/api/type');
   };
   return typeFactory;

})
.factory('CreateType', function($http){
   var typeFactory = {};
   typeFactory.create = function(typeData){
      return $http.post('/api/type/add', typeData);
   };
   return typeFactory;
})

我的 HTML:

<div ng-controller="AddTypeController as type">
<form>
   <md-select ng-model="type.typeData.type" placeholder="Type">
      <md-option ng-value="typeone.type" ng-repeat="typeone in type.types">{{typeone.type}}</md-option>
   </md-select>
   <md-input-container flex>
      <label>SubTyp</label>
      <input ng-model="type.typeData.subtype">
   </md-input-container>
   <button ng-click="type.createType()">Send</button>
</form>
</div>

现在我遇到一个问题: 例如我还没有数据。我添加第一个选择 - TypeOne,第二个选择 - SubTypeOne。现在在数据库中我有{类型:TypeOne,子类型:SubTypeOne}。当我将第二个子类型添加到 TypeOne 时,我选择第一个选择 TypeOne 并在输入中添加子类型 - SubTypeTwo。现在我在数据库中有第二条记录{type:TypeOne,subtype:SubTypeTwo},在此之后在第一个选择中我有TypeOne两次。

但我想做这样的事情:如果我已经有需要的类型,并且只想添加新的子类型。在这种情况下,我希望在数据库中有这样的内容:{type: TypeOne, subtype:[subtype: SubTypeOne, subtype: SubTypeTwo]}。为此,我应该像数组一样保存子类型,但不明白如何保存。

最佳答案

在您的模型中,您应该将子类型作为字符串数组。然后你可以将它们推送到该数组上。示例如下:

var Type = new Schema({
    type: String,
    subtype: [String]
});

然后你可以有一个更新方法(mongoose:findOneAndUpdate),而不仅仅是创建一个新类型。或者您可以让它检查是否可以找到并更新它,否则创建一个新的。示例如下:

CreateType.findOneAndUpdate({type: 'type1'},
    {$push: {subtype: 'type2'} },
    function(err, data) {
    if (err)
        // Do the create for a new one here
    else
        // Send back a 200 OK or whatever else
});

这将允许您按原样更新数组。我鼓励您查看findOneAndUpdate关于 mongoose 的文档,以及 $push蒙戈文档。

希望这有帮助!我最近一直在开发一个应用程序,它基本上就是我在这里描述的。所以我实际上一直在使用它来证明它是有效的。

关于javascript - 正确保存数据到mongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32805931/

相关文章:

javascript - 如何创建一个没有控件的完全空白的 Brightcove 播放器模板?

像对象构造函数一样的 JavaScript 服务 : how to provide a () method,?

arrays - 如何将数组作为参数传递给另一个脚本?

javascript - 不使用键访问 json 对象中的数组

angularjs - Karma 单元测试在无限循环中一遍又一遍地运行

javascript - Natviescript 中的 Angular 单元测试 : reflect-metadata shim is required when using class decorators

javascript - 如何避免在 JavaScript 的动态样式期间进行转换

javascript - 对象中的 Angular 过滤器空数组

java - 如何查找以用户输入的字母开头的名称?

javascript - Angular JS 中的响应子节点应用于多维数组对象中的过滤器