Ошибка обновления ресурса AngularJS-MongoLab $

Я подключаю AngularJS к MongoLab и пытаюсь обновить коллекцию «users».

Служба ресурсов AngularJS:

angular.module("myApp.services", ["ngResource"])
        .constant({
            DB_URL: "https://api.mongolab.com/api/1/databases/mydb/collections/users/:id",
            API_KEY: "[SOME_RANDOM_KEY]"
        })
        .factory("UsersService", ["$resource", "DB_URL", "API_KEY", function($resource, DB_URL, API_KEY) {
            return $resource(DB_URL, { apiKey: API_KEY, id: "@_id.$oid" }, { update: { method: "PUT" }});
        }]);

Вот как я пытаюсь обновить свою коллекцию пользователей:

angular.module("myApp", ["myApp.services"])
        .controller("AppController", ["$scope", "UsersService", function($scope, UsersService) {
            $scope.users = [];              
            $scope.getAllUsers = function() {
                $scope.users = UsersService.query();
            };              
            $scope.updateUser = function(user) { // user: firstName, lastName, email
                //delete user._id;
                UsersService.update({}, user, function() {
                    $scope.users = UsersService.query();
                    console.log("Users updated successfully");
                }, function() {
                    console.log("Some problems updating the user", arguments);
                });
            };
        }]);

Когда я пытаюсь обновить информацию о пользователе, выдается исключение:

{ "message" : "cannot change _id of a document old:{ _id: ObjectId('[SOME_RANDOM_KEY]'), firstName: \"Anup\", lastName: \"Vasudeva\", email: \"[email protected]\" } new:{ _id: {}, firstName: \"Anup\", lastName: \"Vasudeva\", email: \"[email protected]\" }"

Я новичок в MongoDB, поэтому не понимаю, почему он создает пустой объект _id для нового экземпляра пользователя?


person Anup Vasudeva    schedule 24.01.2014    source источник
comment
_id зарезервирован mongoDB и должен быть уникальным для каждой коллекции. Ему нужен идентификатор. Может быть, вам нужно предоставить его или, по крайней мере, не давать ему пустой объект?   -  person Richard    schedule 29.05.2014


Ответы (1)


Попробуйте изменить функцию $scope.updateUser на следующее:

$scope.updateUser = function (user) {
  var userId = user._id.$oid;
  user._id = undefined;
  UsersService.update({id: userId}, user, function () {
    $scope.users = UsersService.query();
    console.log("Users updated successfully");
  }, function () {
    console.log("Some problems updating the user", arguments);
  });
};

Объект обновления/замены («пользователь») не должен содержать свойство _id при передаче в UsersService.update(). Mongo не заменит значение _id, поэтому после обновления идентификатор останется прежним. Еще одна вещь, которая изменилась в этой функции, заключается в том, что мы передаем идентификатор пользователя в качестве первого параметра функции UsersService.update(), чтобы монго знал, какой документ нужно обновить.

person irnscrb    schedule 06.08.2014