假设我们有以下集合,我对此有疑问:
{
"_id" : ObjectId("5c0798cfa572a912a7d93308"),
"shop_name" : "Royal Foods",
"address" : "Colombo",
`"items" : [
{
"_id" : ObjectId("5c0798cfa572a912a7d9330d"),
"item_name" : "Pasta",
},
{
"_id" : ObjectId("5c0798cfa572a912a7d9330c"),
"item_name" : "Noodles",
},
{
"_id" : ObjectId("5c0798cfa572a912a7d9330b"),
"item_name" : "Rice & Curry",
}
]
}
我想删除“ Pasta”的第一项而不删除整个文档。我想使用Delete Restful API做到这一点。我将Nodejs和Express用于后端开发。 我尝试了以下方法:
router.delete('/ninjas/:id', function(req,res){
Shop.findByIdAndRemove({_id: req.params.id}).then(function(Shop{
res.send(Shop);
});
});
但是,当我将商店ID传递给此api时,它将删除整个集合。我只需要删除“意大利面”食品。
答案 0 :(得分:1)
findByIdAndRemove查找并删除该文档。 如果您有一个单独的Item模型,那会更好,但是无论如何,为了从文档中的items数组中删除特定项目,可以使用Array过滤器方法。
Shop.findById(req.params.id,(err, foundShop) => {
if(err) console.log(err);
if(!foundShop) {
// Shop Doesn't Exists
res.send('Shop Doesn\'t exist');
}
if(foundShop) {
// Shop Exists
const filteredItems = foundShop.items.filter(item => item.item_name !== 'Pasta'); // Returns a new Array with the Item Pasta removed.
foundShop.items = filteredItems;
foundShop.save();
res.send('Item has been removed from the array');
}
});
答案 1 :(得分:0)
我认为您正在使用猫鼬。
Shop.findOneAndUpdate(
{ _id: req.params.id },
{ $pull: item_name: "Pasta" },
{ new: true }
).then(function(Shop{
res.send(Shop);
});
方法findByIdAndRemove
会删除整个文档,因为您只想更改它,所以应该使用findOneAndUpdate
答案 2 :(得分:-1)
您的路由器似乎有语法错误:
router.delete('/ninjas/:id', function(req,res){
Shop.findByIdAndRemove({_id: req.params.id}).then(function(Shop{
res.send(Shop);
});
});
您的诺言:
.then(function(Shop) {
res.send(Shop)
})
...将是正确的。希望能有所帮助 但是返回这样的Shop对象非常不寻常。
.then(function(result) {
res.send(result)
})
...将会是更常见的模式
此外,findbyidandremove
可能不会返回已删除的对象。您需要检查在线文档(我假设是猫鼬)
答案 3 :(得分:-1)
查看他们的文档here。
您可以创建一个文件,例如“ deletePasta.js”,然后粘贴以下行。
db.{{databaseName}}.deleteOne( { "_id" : ObjectId("5c0798cfa572a912a7d9330d") } );
只需将databseName插入{{databaseName}}
mongo {{apiName}} < deletePasta.js
将其粘贴到控制台中,并将{{apiName}}替换为您的API名称。