Node.js 如何使用findOneAndRemove删除Mongoosejs中的单个子文档?

Node.js 如何使用findOneAndRemove删除Mongoosejs中的单个子文档?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有这样的猫鼬模式: var question = new Schema({ title : String, gambar : String }); var polling = new Schema({ id_poll : String, soal : [question] }); polling.findOneAndRemove({_id:req.params.poll_id, soal[req.params.soal]._id:

我有这样的猫鼬模式:

var question = new Schema({
   title : String,
   gambar : String
});

var polling = new Schema({
id_poll : String,
soal : [question]
});
polling.findOneAndRemove({_id:req.params.poll_id, soal[req.params.soal]._id:
                                                      ^
SyntaxError: Unexpected token [
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:935:3
我想通过数组索引删除所有子文档soal,使用findOneAndRemove方法,如下所示

polling.findOneAndRemove({_id:req.params.poll_id, soal[req.params.soal]._id: req.params.id_soal}, function(err){
if(err) throw err;
console.log("soal deleted");
});
但它会抛出如下错误:

var question = new Schema({
   title : String,
   gambar : String
});

var polling = new Schema({
id_poll : String,
soal : [question]
});
polling.findOneAndRemove({_id:req.params.poll_id, soal[req.params.soal]._id:
                                                      ^
SyntaxError: Unexpected token [
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:935:3

因此,我如何在不知道子文档索引的情况下删除子文档呢?我在谷歌上搜索了它,并使用操作符
$pull
找到了它,但我仍然不知道如何将它应用到我的代码中。需要建议和帮助。非常感谢

我从您提供的详细信息中了解到,您有两种可能的方法来删除
soal
字段:

  • soal
    数组的值设置为
    []

    polling.update({_id: req.params.poll_id }, { $set: { soal: [] }}, function(err, response) {
        if (err) {
            console.log('There was an error with your request');
        }
    
        console.log('Mongo update from running the update query', response);
    }));
    
  • 从检索的文档中永久删除
    soal
    属性

    polling.update({_id: req.params.poll_id }, { $unset: { soal: "" }}, function(err, response) {
        if (err) {
            console.log('There was an error with your request');
        }
    
        console.log('Mongo update from running the update query', response);
    }));
    

  • 您是否正在尝试清空所查询元素的soal数组?我正在尝试删除它@VladZ@albertono
    req.params.soal
    包含什么?它似乎包含要删除的
    soal
    元素的索引,但您随后会说“我如何在不知道其索引的情况下删除子文档”。@johnyhk yes req.params.soal包含我要删除的soal数组的索引,抱歉,我不擅长解释某些内容。谢谢,但在mongoose中如何做到这一点?据我所知,它是一个mongodb查询,在CLI中使用。@Alberto i只包括CLI查询,因为mongoose严格遵循其语法。我现在已经更新了。希望有帮助!非常感谢。为什么在no 1中使用$set,而在no 2中使用$unset?有什么不同?我提出了两种不同的方法。正如我在回答中提到的,在第一种情况下,您将soal数组的值设置为空,从而删除所有元素。在第二个场景中,使用$unset运算符永久删除一个字段,而不管该字段的类型如何。soal数组包含一个填充了应答对象的数组,因此如果要删除soal[0],它将是{$set:{soal:[req.params.soal]}}对吗??as req.params.soal包含我要删除的数组的索引。