我的模型文档中有一个数组。我想根据我提供的密钥删除该数组中的元素,然后更新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();
});
});
};
到目前为止,它找到了文档,但删除或保存工作。
答案 0 :(得分:79)
您也可以直接在MongoDB中进行更新,而无需加载文档并使用代码对其进行修改。使用$pull
或$pullAll
运算符从数组中删除项目:
Favorite.update( {cn: req.params.name}, { $pullAll: {uid: [req.params.deleteUid] } } )
http://docs.mongodb.org/manual/reference/operator/update/pullAll/
答案 1 :(得分:39)
已检查的答案确实有效,但最近在MongooseJS中正式使用,您应该使用 pull 。
doc.subdocs.push({ _id: 4815162342 }) // added
doc.subdocs.pull({ _id: 4815162342 }) // removed
https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-pull
我也只是看着它。
请参阅Daniel的回答以获得正确答案。好多了。
答案 2 :(得分:5)
由于收藏夹是一个数组,您只需要将其拼接起来并保存文档。
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);
});
};
答案 3 :(得分:4)
上面的答案显示了如何删除数组,以及如何从数组中拉出对象。
参考:https://docs.mongodb.com/manual/reference/operator/update/pull/
db.survey.update( // select your doc in moongo
{ }, // your query, usually match by _id
{ $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } }, // item(s) to match from array you want to pull/remove
{ multi: true } // set this to true if you want to remove multiple elements.
)
答案 4 :(得分:2)
这对我有用,非常有帮助。
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
。因此,我在$in
运算符的帮助下,使用map函数从此数组中获取每个对象数组。
答案 5 :(得分:1)
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
如果您想使用...
,请拨打js文件顶部的'use strict';
; :)