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
操作符来实现这一点。另一种方法是找到文档,然后使用mongoosepull
方法更新数组。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});)是的,很好用,谢谢!