通过mongoose

时间:2016-08-19 16:19:03

标签: node.js mongodb express mongoose

我试图删除嵌套在嵌套在MongoDB文档中的数组内的文档。

模式

{
  "_id": 12345,
  "id": 12345,
  "name": "Test",
  "links": [],
  "training": [],
  "about": [
    {
      "contents": "Test Contents 0",
      "heading": "Test Heading 0"
    },
    {
      "contents": "Test Contents 1",
      "heading": "Test Heading 1"
    },
    {
      "contents": "Test Contents 2",
      "heading": "Test Heading 2"
    }
  ]
}

我想删除与路径匹配的子文档

'/:_id/:section/:item'

这样,如果我向DELETE发送/12345/about/1,则子文档包含"测试标题1"将被完全删除。

我尝试了许多不同的方法,例如

.delete(function (req, res) {
    var section = req.params.section_name;
    var item = req.params.item;

    Tool.findOne({'id': req.params._id}, function (err, tool) {
        tool.set(section[item], null);
        tool.save(function (err) {
            res.send(err);
        })
    });
});

但似乎都没有用。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这应该可以完美地运作

.delete(function (req, res) {
    var section = req.params.section_name;
    //convert string to int
    var item = +req.params.item; //or use parseInt(req.params.item)

    Tool.findOne({'id': req.params._id}, function (err, tool) {
        tool[section].splice(item, 1);
        tool.save(function (err) {
            res.send(err);
        })
    });
});

已转换为

tool[section].splice(item, 1);
tool.about.splice(1, 1); //remove 1 item from given index

关于拼接

array.splice(index, 1);
  

splice的第二个参数是要删除的元素数。请注意,splice会修改数组并返回一个包含已删除元素的新数组。

答案 1 :(得分:0)

Tool.findOneAndUpdate(
{
   "_id": req.params._id, "about.heading": "Test Heading 1" 
   // 1. query above will target the document by _id.
   // 2. search [about] and get index then store it at "$",
   // 3. "Test Heading 1" is located at about[1], store it at "$"
   // 4. imagine this line is executed => var $ = 1
}, 
{
   $unset: {"about.$": 1} 
}, 
{
   new:true //means return the updated document (new instead old)

}) 
.exec((err, tool)=>{
    if(err) console.log(err)
})