mongoose - 使用$ pull

时间:2017-02-26 20:44:21

标签: 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":"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)来定位特定链接,但它并没有工作!

需要帮助解决问题,我不知道我在这里缺少什么!

4 个答案:

答案 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))
}

The mongoose docs for pull

答案 2 :(得分:0)

我遇到了类似的问题,就像你的查询一样。我认为您的查询未找到您正在寻找的ID。如果你想通过&_ 39; _id'在mongo中找到一个对象。它需要作为ObjectId传入。尝试修改内容,如下所示:

yako

答案 3 :(得分:0)

我将.update猫鼬函数更改为:

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

一旦将其连接起来,就会将其从数组中拉出。