我有一个如下所示的节点对象:
{
"_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
}
]
}
}
我正在向我的快速服务器发送删除请求,如下所示:
DELETE http://localhost:9000/api/nodes/58b336e105ac8eec70aef159/links/58b336e105ac8eec70aef15d
我按照$pull mongodb documentation中的说明操作,我也尝试了this
但它似乎不起作用,因为我一直在接收:500 (Internal Server Error)
这就是我的快递方面的代码如下:
exports.destroyLink = function(req, res) {
Node.findById(req.params.id, function(err, node) {
if (err) { return handleError(res, err); }
if (!node) { return res.status(404).send('Not Found'); }
console.log("Node", JSON.stringify(node))
console.log("Params", req.params)
node
.update({ '_id': req.params.id }, { $pull: { 'configuration': { 'links': { '_id': req.params.linkId } } } }, false, true)
.then(err => {
if (err) { return handleError(res, err); }
return res.status(204).send('No Content');
});
})
};

快递路由器包含:
router.delete('/:id/links/:linkId', controller.destroyLink);
所以我期待id和linkId为params,我使用id(_id: req.params.id
)来定位特定节点,并使用linkId(_id: req.params.linkId
)来定位特定链接,但它并没有工作!
需要帮助解决问题,我不知道我在这里缺少什么!
答案 0 :(得分:1)
大家好,谢谢你的帮助。我终于开始工作!!!
经过近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
然后更新节点,我使用findByIdAndUpdate
做了两件事。它现在工作得很好!!!
我仍然没有找到其他版本的解释。但无论如何它很高兴它正在以这种方式工作。
答案 1 :(得分:1)
我从来没有使用mongodb $pull
运算符。另一种方法是找到文档,然后使用mongoose pull
方法更新数组。 pull
方法可以将id字符串作为其单个参数,并知道如何处理它。对于使用promises的示例,代码看起来像:
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))
}
答案 2 :(得分:0)
我遇到了类似的问题,就像你的查询一样。我认为您的查询未找到您正在寻找的ID。如果你想通过&_ 39; _id'在mongo中找到一个对象。它需要作为ObjectId传入。尝试修改内容,如下所示:
yako
答案 3 :(得分:0)
我将.update猫鼬函数更改为:
{ $pull: { 'configuration': { 'links': { '_id': ''+req.params.linkId+'' } } } }
一旦将其连接起来,就会将其从数组中拉出。