Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose-使用$pull删除数组中的元素_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript mongoose-使用$pull删除数组中的元素

Javascript mongoose-使用$pull删除数组中的元素,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我有一个节点对象,如下所示: { "_id":"58b336e105ac8eec70aef159", "name":"my node", "ip":"192.168.1.1", "__v":0, "configuration":{ "links":[ { "linkName":"athena_fw_listen_tcp_5555", "_id":"58b336e105ac8eec70ae

我有一个节点对象,如下所示:

{
   "_id":"58b336e105ac8eec70aef159",
   "name":"my node",
   "ip":"192.168.1.1",
   "__v":0,
   "configuration":{
       "links":[
         {
            "linkName":"athena_fw_listen_tcp_5555",
            "_id":"58b336e105ac8eec70aef15d",
            "local":true
         },
         {
            "linkName":"athena_fw_listen_udp_5554",
            "_id":"58b336e105ac8eec70aef15c",
            "local":true
         }
      ]
   }
}
const mongo = require('mongodb');
var oId = new mongo.ObjectID(req.params.id);
update({ '_id': oId }, { $pull: { 'configuration': { 'links': { '_id': req.params.linkId } } } }, false, true)
我正在向我的express服务器发送一个删除请求,如下所示:
删除http://localhost:9000/api/nodes/58b336e105ac8eec70aef159/links/58b336e105ac8eec70aef15d

我遵循了中的说明,也尝试了

但它似乎不起作用,因为我一直收到:
500(内部服务器错误)

我的express端的代码是这样的:

exports.destroyLink=函数(请求、恢复){
Node.findById(req.params.id,函数(err,Node){
if(err){returnhandleerror(res,err);}
if(!node){return res.status(404.send('Not Found');}
log(“节点”,JSON.stringify(节点))
控制台日志(“参数”,要求参数)
节点
.update({u id':req.params.id},{$pull:{'configuration':{'links':{'u id':req.params.linkId},false,true)
。然后(err=>{
if(err){returnhandleerror(res,err);}
返回res.status(204).send('No Content');
});
})

};我遇到了一个类似的问题,就是得到一个像你这样的查询。我认为您的查询没有找到您要查找的id。如果要通过“\u id”在mongo中查找对象,则需要将其作为ObjectId传入。尝试修改内容,使其看起来像这样:

{
   "_id":"58b336e105ac8eec70aef159",
   "name":"my node",
   "ip":"192.168.1.1",
   "__v":0,
   "configuration":{
       "links":[
         {
            "linkName":"athena_fw_listen_tcp_5555",
            "_id":"58b336e105ac8eec70aef15d",
            "local":true
         },
         {
            "linkName":"athena_fw_listen_udp_5554",
            "_id":"58b336e105ac8eec70aef15c",
            "local":true
         }
      ]
   }
}
const mongo = require('mongodb');
var oId = new mongo.ObjectID(req.params.id);
update({ '_id': oId }, { $pull: { 'configuration': { 'links': { '_id': req.params.linkId } } } }, false, true)

大家好,谢谢你们的帮助。我终于成功了

经过近3个小时的故障排除:“(:”(这是使用的解决方案:

exports.destroyLink = function(req, res) {
Node.findByIdAndUpdate(
    req.params.id, { $pull: { "configuration.links": { _id: req.params.linkId } } }, { safe: true, upsert: true },
    function(err, node) {
        if (err) { return handleError(res, err); }
        return res.status(200).json(node.configuration.links);
    });
};
我没有使用
findById
然后更新节点,而是同时使用
findById和update
。它现在工作得很好


尽管我仍然找不到其他版本的解释。但无论如何,我很高兴它能以这种方式工作。

我从来没有使用mongodb
$pull
操作符来实现这一点。另一种方法是找到文档,然后使用mongoose
pull
方法更新数组。
pull
方法可以将id字符串作为其名称单个参数,并且知道如何处理它。对于这个使用承诺的示例,代码如下所示:

exports.destroyLink = function(req, res) {
  Node.findById(req.params.id)
    .then(node => {
      node.configuration.links.pull(req.params.linkId)
      return node.save()
    .then(node => res.send(node.configuration.links))
}

我将.update mongoose功能更改为以下内容,使其正常工作:

{ $pull: { 'configuration': { 'links': { '_id': ''+req.params.linkId+'' } } } }

一旦你连接了它,它就会从数组中拉出来。

你能试试
{$pull:{'configuration.links':{'u id':req.params.linkId}}
?@Veeram我以前试过你的建议,现在试过了,但没有用!:'(我把我的代码行更新到这个:
节点。update({'u id':req.params.id},{$pull:{'configuration.links':{'u id':req.params.linkId}},函数(err,data){console.log(“data”,data)if(err){return handleError(res,err);}return res.status(204)。send('No Content');})
这是我在控制台中得到的:
数据{ok:1,nmoded:0,n:1}
好的,不知道如何修复它。另一方面,
配置
键在您的文档中是多余的。如果它对您有效,您可以删除它,然后您可以访问文档中提到的
链接
。哦,那是因为我计划将其他元素添加到
配置
,所以我更愿意将它保留在本文档中y、 无论如何,谢谢你,我很感激!不客气。所以我进一步研究了一下。我不太了解mongoose。你可以验证
\u id
在你的mongoose架构中定义为
String
。如果它被定义为
ObjectId
,那么你必须将
req.params.id
req.params.linkId
转换为
ObjectId
在将其传递给查询之前。顺便说一句,我在mongo shell中建议的查询编辑工作正常。我尝试将参数转换为
mongoose.Types.ObjectId
,正如您在上面建议的那样
mongo.ObjectId
。据我从下面这行了解,删除请求已被接受并成功。
delete/api/nodes/58b356a18f54358c5b9c2123/links/58b356a18f54358c5b9c2127 204 13ms
但是,节点对象的“configuration.links”数组中似乎仍然有要删除的链接。谢谢,在花费了大量时间之后,您的答案解决了我的问题。为了使FindByi和Update工作,我必须将UseFindModify设置为false(mongoose.connect(uri,{useFindAndModify:false});)是的,很好用,谢谢!