具有Node.js(Express)的MongoDB:删除文档数组中的属性

时间:2018-12-05 16:00:57

标签: node.js mongodb express

假设我们有以下集合,我对此有疑问:

{
 "_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时,它将删除整个集合。我只需要删除“意大利面”食品。

4 个答案:

答案 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名称。