【问题标题】:Unable to update an object inside MongoDB collection using HTTP Put?无法使用 HTTP Put 更新 MongoDB 集合中的对象?
【发布时间】:2014-09-25 16:16:00
【问题描述】:

我是 AngularJS 的新手,我正在尝试更新我的 MongoDB 数据库。当我尝试更新集合中的对象时遇到问题。以下是我尝试这样做的尝试:

//listviewFactory is already injected and returns an event object
//I call $scope.put when clicking (ng-click) on a button

$scope.event = listviewFactory.getEvent();

$scope.put = function(event){
    var currentUser = {};
    if($cookieStore.get('token')) {
        currentUser = User.get();
    }

    event.attendees.push(currentUser);

    $http.post('/api/events/' + event._id, event).success(function(data){
      for(var i = 0; i < event.attendees.length; i++){
        console.log("Attendees: ", event.attendees[i]);
      }

      $location.path('/');
    });

};

我只是不确定为什么我的代码不起作用。当我执行$http put 请求时,我的函数成功并继续执行console.log。当我打印出attendees 数组时,我看到currentUser 对象确实附加到了我的event.attendees 数组中。但是,当我使用 Mongo shell 检查我的数据库时,我的参加者数组没有更新并且保持空白。关于我为什么或在哪里可能出错的任何想法?下面也是我如何路由应用程序并指定如何在 MongoDB 中存储信息的服务器端代码。

module.exports = function(app) {
  app.use('/api/events', require('./api/event'));
  ...
}

module.exports = mongoose.model('Event', EventSchema);
    var express = require('express');
    var controller = require('./event.controller');

    var router = express.Router();

router.get('/', controller.index);
router.put('/:id', controller.update);

// Updates an existing event in the DB.
exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  Event.findById(req.params.id, function (err, event) {
    if (err) { return handleError(err); }
    if(!event) { return res.send(404); }
    var updated = _.merge(event, req.body);
    updated.save(function (err) {
      if (err) { return handleError(err); }
      return res.json(200, event);
    });
  });
};

编辑:当我 console.log 当前用户:

Current User:  
Resource {$promise: Object, $resolved: false, $get: function, $save: function, $query: function…}
$promise: Object
$resolved: true
__v: 0
_id: "53dd72fb5a24aa781a3cbde8"
email: "test@test.com"
name: "Test User"
provider: "local"
role: "user"

编辑:猫鼬模式:

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var EventSchema = new Schema({
    startDate: Date,
    endDate: Date,
    eventLocation: String,
    eventName: String,
    attendees: Array
});

【问题讨论】:

    标签: javascript node.js angularjs mongodb mongoose


    【解决方案1】:

    我假设您使用的是mongoose。试试

    updated.markModified('attendees');
    

    之前 updated.save 来电。

    关于推送当前用户,做一些相当于

    event.attendees.push({__v: 0
        _id: "53dd72fb5a24aa781a3cbde8"
        email: "test@test.com"
        name: "Test User"
        provider: "local"
        role: "user"})
    

    即只推送相关字段。

    【讨论】:

    • 嗯,所以当我在 markModified 函数调用中添加时,我查看了我的数组,发现与会者中有一个新对象,但它没有显示任何内容(数组中的对象是空白的)。任何想法为什么?我还添加了我的猫鼬模式。
    • 似乎是架构问题。你能给我们一个currentuser 的console.log 和你的attendees 架构吗
    • 好的,我在mongoose schemacurrentUser 的console.log 中添加了。有什么想法吗?
    • @user1871869 我对 Angular 不是很熟悉,但是为什么要将资源推送到 event.attendees。只需在您提供的 console.log 中推送包含最后 6 个字段的对象。
    • 嗯,你会怎么做?我正在推送一个对象,该对象包含给定的 console.log 中的最后 6 个字段。如果我不将其推送到 even.attendees,您建议我将其推送到哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多