Mongoose удалить элемент массива в документе и сохранить

У меня есть массив в моем модельном документе. Я хотел бы удалить элементы в этом массиве на основе ключа, который я предоставляю, а затем обновить MongoDB. Это возможно?

Вот моя попытка:

var mongoose = require('mongoose'), Schema = mongoose.Schema; var favorite = new Schema({ cn: String, favorites: Array }); module.exports = mongoose.model('Favorite', favorite, 'favorite'); exports.deleteFavorite = function (req, res, next) { if (req.params.callback !== null) { res.contentType = 'application/javascript'; } Favorite.find({cn: req.params.name}, function (error, docs) { var records = {'records': docs}; if (error) { process.stderr.write(error); } docs[0]._doc.favorites.remove({uid: req.params.deleteUid}); Favorite.save(function (error, docs) { var records = {'records': docs}; if (error) { process.stderr.write(error); } res.send(records); return next(); }); }); }; 

Пока он находит документ, но удаляет и сохраняет работы.

Вы также можете сделать обновление непосредственно в MongoDB без необходимости загружать документ и изменять его с помощью кода. Используйте операторы $pull или $pullAll для удаления элемента из массива:

 Favorite.update( {cn: req.params.name}, { $pullAll: {uid: [req.params.deleteUid] } } ) 

http://docs.mongodb.org/manual/reference/operator/update/pullAll/

Проверенный ответ действительно работает, но официально в MongooseJS последним, вы должны использовать pull .

 doc.subdocs.push({ _id: 4815162342 }) // added doc.subdocs.pull({ _id: 4815162342 }) // removed 

http://mongoosejs.com/docs/api.html#types_array_MongooseArray-pull

Я тоже выглядел так.

См. Ответ Дэниела для правильного ответа. Намного лучше.

Поскольку избранное – это массив, вам просто нужно соединить его и сохранить документ.

 var mongoose = require('mongoose'), Schema = mongoose.Schema; var favorite = new Schema({ cn: String, favorites: Array }); module.exports = mongoose.model('Favorite', favorite); exports.deleteFavorite = function (req, res, next) { if (req.params.callback !== null) { res.contentType = 'application/javascript'; } // Changed to findOne instead of find to get a single document with the favorites. Favorite.findOne({cn: req.params.name}, function (error, doc) { if (error) { res.send(null, 500); } else if (doc) { var records = {'records': doc}; // find the delete uid in the favorites array var idx = doc.favorites ? doc.favorites.indexOf(req.params.deleteUid) : -1; // is it valid? if (idx !== -1) { // remove it from the array. doc.favorites.splice(idx, 1); // save the doc doc.save(function(error) { if (error) { console.log(error); res.send(null, 500); } else { // send the records res.send(records); } }); // stop here, otherwise 404 return; } } // send 404 not found res.send(null, 404); }); }; 

Это работает для меня и действительно очень полезно.

 SubCategory.update({ _id: { $in: arrOfSubCategory.map(function (obj) { return mongoose.Types.ObjectId(obj); }) } }, { $pull: { coupon: couponId, } }, { multi: true }, function (err, numberAffected) { if(err) { return callback({ error:err }) } }) }); 

У меня есть модель, имя которой – SubCategory и я хочу удалить купон из этой категории. У меня есть массив категорий, поэтому я использовал arrOfSubCategory . Поэтому я получаю каждый массив объекта из этого массива с помощью функции map с помощью оператора $in операторе.

 keywords = [1,2,3,4]; doc.array.pull(1) //this remove one item from a array doc.array.pull(...keywords) // this remove multiple items in a array 

если вы хотите использовать ... вы должны называть 'use strict'; в верхней части вашего js-файла; 🙂

  • npm WARN notsup ПРОПУСТИТЬ ДОПОЛНИТЕЛЬНАЯ ЗАВИСИМОСТЬ: Неподдерживаемая платформа для [email protected]
  • Как заставить Fish shell и NVM установить вместе с Homebrew для совместной работы?
  • Невозможно выбросить ошибку из функции выполнения асинхронного обещания
  • Как запустить файлы TypeScript из командной строки?
  • Node.js - Как удалить порт из URL-адреса?
  • NodeJS - Ошибка при установке с помощью NPM
  • Загрузите модуль node.js из строки в памяти
  • Как подключить два сервера node.js с websockets?
  • Как настроить SSL-сертификат для сервера express.js?
  • Разрешить запрос CORS REST в приложение Express / Node.js на Heroku
  • Как я могу получить список обратных вызовов в рабочей очереди узла? (или, почему Node не выйдет?)
  • Давайте будем гением компьютера.