LINUX.ORG.RU

Удаление нескольких документов из коллекции

 , ,


1

1

Я новичок в MomgoDB. При разработке приложения столкнулся с проблемой удаления нескольких документов из коллекции. Точнее удаляются все документы вместо указанных.
На сервер с помощью ajax передается запрос на удаление, где данные представлены так:

[{_id:"lskdfjlskf"},{_id:"skdvnos3lmsdk"}]
Обработчик на сервере:
app.delete('/ajax/users', function(req, res) {
    var userData = req.body;
    console.log(studentData.deleteSet)
    Users.remove(studentData.deleteSet, function(err) {
        if(err) res.json(err);
        res.json(usersData.deleteSet);
        console.log('Selected students was deleted');
    });
});
(Функция тестовая в финальном варианте будет отдавать все необходимые ответы)
Я так понимаю функция .remove работает только с одним документом. Каким образом можно реализовать удаление нескольких документов одновременно?
Пробовал через цикл, но это тоже не то. Так как удаляются все документы, как и при первом варианте.

Ответ на: комментарий от PaulTmatik

Поле _id уникальное по умолчанию. Ты можешь изменить его поведение, удалив индекс и заменив на индекс без учета уникальности. Либо изменить запрос.

И запрос кривой. Используй оператор $or:

db.col.remove({ $or: [{...}, {...}] })

gh0stwizard ★★★★★ ()
Последнее исправление: gh0stwizard (всего исправлений: 2)
Ответ на: комментарий от gh0stwizard

Меня в индексах все устраивает. Я просто не могу понять, почему mongoose удаляет все записи которые есть в коллекции. То есть запись.

.remove([{_id: "Идентификатор"},{_id: "Идентификатор"}], function(err){...});
равносильна:
.remove(function(err){...});
Хотя вот так
.remove({name: "Иван"}, function(err){...});
удаляет этого Ивана, но в коллекции этих Иванов может быть много.

PaulTmatik ()
Ответ на: комментарий от PaulTmatik

Еще раз, для уникальных записей используй оператор $or. Чтобы понять, что будет удалено, тестируй через db.col.find(). Читай документацию, книги, хаутушки. Поймешь как составлять запросы и не будет проблем с управлением записей.

И mongoose это вообще странный зверь :)

http://mongoosejs.com/docs/api.html#model_Model-remove

И где ты там увидел, что поступает запрос?

Далее:

http://mongoosejs.com/docs/api.html#model_Model.findByIdAndRemove

Note:

This method sends a remove command directly to MongoDB, no Mongoose documents are involved. Because no Mongoose documents are involved, no middleware (hooks) are executed.

http://mongoosejs.com/docs/api.html#model_Model.remove

gh0stwizard ★★★★★ ()
Ответ на: комментарий от PaulTmatik

Ложанулся :)

> db.posts.find({}, {_id:1})
{ "_id" : ObjectId("51e0fefa73dd432a64000004") }
{ "_id" : ObjectId("51e5b2a83784bb096a00000a") }
{ "_id" : ObjectId("51e0f84673dd432a64000000") }
...
> db.posts.find({ "_id": { $in:[ ObjectId("51e0fefa73dd432a64000004"), ObjectId("51e0f84673dd432a64000000")] }}, {_id:1})
{ "_id" : ObjectId("51e0f84673dd432a64000000") }
{ "_id" : ObjectId("51e0fefa73dd432a64000004") }
gh0stwizard ★★★★★ ()
Ответ на: комментарий от gh0stwizard

Да читал уже и не раз. В мануале я это видел, там даже есть кнопочка которая показывает, как работает функция. В мануалах по монго remove вообще вскользь упоминается и с примерами из официальной документации. Поэтому и пишу на форуме чтобы помогли решить проблему.

PaulTmatik ()
Ответ на: комментарий от PaulTmatik

Версия монго какая?

P.S. Проверил $or на 2.4.5 - все работает как описал выше. На 1.4.4 $or не работает, а $in работает как и положено.

gh0stwizard ★★★★★ ()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от PaulTmatik

Вобщем, больше ничем помочь не могу. С mongoose я не работал. Возможно ты перепутал методы или применяешь на не тех коллекциях. Для монго все варианты, которые я описал - рабочие. Должно и находиться и удаляться (соответственно).

gh0stwizard ★★★★★ ()
Ответ на: комментарий от gh0stwizard

все спасибо дружище, помог.

{_id: { $in:[ "51e0fefa73dd432a64000004", "51e0f84673dd432a64000000"] }}
Вот такой запрос проходит как надо.

PaulTmatik ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.