Не удается удалить документ из Mongodb через экспресс-маршрут

Я хочу удалить документ Mongodb по идентификатору, передав его экспресс-маршруту.
В консоли я получаю сообщение о том, что он удален.

GET /api/videolinks 304 94.792 ms - -
Removed id= 562b905f633288ac0d8b4567
DELETE /api/videolinks/562b905f633288ac0d8b4567 200 68.550 ms - 19743

Но это не так.

> db.hyperlinks.find({"_id": ObjectId("562b905f633288ac0d8b4567")})
{ "_id" : ObjectId("562b905f633288ac0d8b4567"), "file" : "http://storage.akamai.com/get/b113/p/coub/simple/cw_file/79632d71313/9aedca2cd4d3094e75834/iphone_hellosergii_iphone.mp4" }

Моя фабрика Angularjs:

/*global angular*/
angular.module('myService', [])

    // each function returns a promise object 
    .factory('Videolinks', ['$http',function($http) {
        return {
            get : function() {
                return $http.get('/api/videolinks');
            },
            delete : function(id) {
                return $http.delete('/api/videolinks/' + id);
            }
        };
    }]);

Мой маршрут.js

var path = require('path');
var Videolink = require('./models/mydb');

var mongodb = require('mongodb');

// Get links
function getLinks(res){
  Videolink.find(function(err, hyperlinks) {
    // if there is an error retrieving, send the error. nothing after res.send(err) will execute
    if (err) {
        res.send(err);
    }

    res.json(hyperlinks); // return all videos in JSON format
  });
}

module.exports = function(app) {

    // api ---------------------------------------------------------------------

  // use mongoose to get all videos in the database
    app.get('/api/videolinks', function(req, res) {
        getLinks(res);
    });

    // delete a video
    app.delete('/api/videolinks/:video_id', function(req, res) {
        Videolink.remove({
            _id : mongodb.ObjectID(req.params.video_id)
        }, function(err) {

            if (err) {
                res.send(err);
            }
            console.log("Removed id= " + req.params.video_id);

            getLinks(res);
        });
    });


    // application -------------------------------------------------------------
    app.get('*', function(res) {
        res.sendFile('index.html', {root: path.join(__dirname, './public')}); // load the single view file 
    });
};

Функциональность app.get здесь работает очень хорошо.
Что может быть не так с app.delete?

Вот моя схема БД в models/mydb

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

var db_schema = new Schema({
  //text: String
  _id: String,
  source: String,
  orig_page: String,
  likes: Number,
  title: String,
  file: String,
  video_mobile_res: String,
  video_high_res_mutes_muted: String,
  audio_high_res: String,
  video_med_res_muted: String,
  audio_med_res: String
}, {collection: 'hyperlinks'});

module.exports = mongoose.model('Videolink', db_schema);

person srgbnd    schedule 06.04.2016    source источник
comment
То, что вы указали, что оно было удалено в консоли, не делает его таковым. Вы используете мангуст?   -  person Robert Moskal    schedule 07.04.2016
comment
Да, я использую мангуст.   -  person srgbnd    schedule 07.04.2016
comment
Используете ли вы какой-либо прокси для приложения. Я знаю, что глагол удаления иногда не включен как допустимый глагол, и его нужно разрешить.   -  person Norm Crandall    schedule 07.04.2016
comment
@RobertMoskal, я обновил свой вопрос схемой БД.   -  person srgbnd    schedule 07.04.2016


Ответы (1)


Ваша конкретная проблема заключается в том, что вы определили поле _id как строку в своей схеме:

var db_schema = new Schema({
   _id: String,
   ...

Уберите это, и ваш код должен работать нормально. Возможно, вы даже обнаружили ошибку мангуста, поскольку предполагается, что вы можете указать тип поля _id. Может быть, какой-нибудь эксперт по мангустам расскажет нам больше.

person Robert Moskal    schedule 06.04.2016
comment
Я изменил на Videolink.remove({_id : req.params.video_id}..., но это не помогло. - person srgbnd; 07.04.2016
comment
Команда db.hyperlinks.find({"_id": ObjectId("562b905f633288ac0d8b4567")}) возвращает документ. А db.hyperlinks.find({"_id": "562b905f633288ac0d8b4567"}) результата не дает. Кажется, id — это объект. - person srgbnd; 07.04.2016
comment
Удалите _id:String в конструкторе схемы. Посмотрим, исправит ли это. Затем вы можете попробовать findByIdAndRemove, который должен иметь возможность принуждать строку. - person Robert Moskal; 07.04.2016
comment
Я удалил _id: String из схемы БД. И теперь это работает, документ удален. Спасибо. - person srgbnd; 07.04.2016
comment
Я никогда не видел указанный тип поля _id. Это должно ввести это странное поведение. Я обновлю свой ответ, это может помочь кому-то еще. - person Robert Moskal; 07.04.2016