문서의 배열 요소를 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.updateOne({ cn: req.params.name }, {
$pullAll: {
favorites: req.params.deleteUid,
},
});
배열에서 개체를 제거하려면 다음과 같이 하십시오.
Favorite.updateOne({ cn: req.params.name }, {
$pullAll: {
favorites: [{_id: req.params.deleteUid}],
},
});
(여러 문서에 대해 updateMany를 사용할 수도 있습니다.)
http://docs.mongodb.org/manual/reference/operator/update/pullAll/
확인된 답변은 작동하지만 공식적으로 Mongoose에서 작동합니다.JS 최신, 당신은 pull을 사용해야 합니다.
doc.subdocs.push({ _id: 4815162342 }) // added
doc.subdocs.pull({ _id: 4815162342 }) // removed
https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-pull
저도 그걸 찾아보고 있었어요.
정답은 다니엘의 답을 참고하세요.한결 나아요.
위의 답변은 배열을 제거하는 방법과 배열에서 개체를 끌어내는 방법을 보여줍니다.
참조: 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.
)
즐겨찾기가 배열이므로, 문서를 분할하고 저장하기만 하면 됩니다.
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
그래서 저는 이 배열에서 각각의 객체 배열을 지도 함수와 함께 가져옵니다.$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 파일의 맨 위에; :)
제 프로젝트에 이 형식을 사용했고 작동했습니다.
router.delete('/dashboard/participant/:id', async (req, res, next) => {
try {
const participant = await Participant.findByIdAndDelete({ _id: req.params.id });
// { $pull: { templates: { _id: templateid } } },
const event = await Event.findOneAndUpdate({ participants: participant._id }, { $pull: { participants: participant._id } }, { new: true });
res.status(200).json({ request: 'Deleted', participant, event });
} catch (error) {
res.json(error)
}
});
Favorite.update({ cn: req.params.name }, { "$pull": { "favorites": { "_id": favoriteId } }}, { safe: true, multi:true }, function(err, obj) {
//do something smart
});
이것은 Mongoose를 사용한 TypeScript의 샘플입니다.
// Each company has COI
// COI looks like { buildingId: string, name: string, file: string }
// Company is an Entity Company looks like { companyId: string, cois: COI[] }
function deleteCOI(companyId: string, buildingId: string) {
const company = await Companies.findOneAndUpdate(
{ companyId },
{ $pull: { cois: { buildingId: buildingId } } }
);
return company;
}
언급URL : https://stackoverflow.com/questions/14763721/mongoose-delete-array-element-in-document-and-save
'programing' 카테고리의 다른 글
로드 밸런서에 클라이언트: 회의에 사용할 수 있는 서버가 없습니다. (0) | 2023.07.24 |
---|---|
#define에서 ##은 무엇을 의미합니까? (0) | 2023.07.24 |
"NUMBER"와 "NUMBER(*,0)"는 Oracle에서 동일합니까? (0) | 2023.07.24 |
파이썬에서 호출 함수 모듈의 __name_을(를) 가져옵니다. (0) | 2023.07.24 |
StackOverflowError(스택오버플로 오류)로 인해 웹 응용 프로그램 [/app]에 대한 주석 검색을 완료할 수 없습니다. (0) | 2023.07.24 |