我试图删除嵌套在嵌套在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);
})
});
});
但似乎都没有用。
非常感谢任何帮助。
答案 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)
})