如何从mongoDB文档数组中删除项目?

时间:2019-12-09 15:31:54

标签: node.js express mongoose controller

enter image description here

这是mongoDb文档,其中包含 listItems (以Array的形式)。 如何删除listItems内具有其各自itemItem的对象。

我正在将 itemsId 作为来自url的参数传递

到目前为止,我已经尝试了两件事。

let deleteItem = (req, res) => {
  let itemToBeDeleted = () => {
    return new Promise ((resolve, reject) => {
      listModel.findOneAndDelete({ 'listItems.itemsId': { $in: [req.params.itemId] } }, (err, data) => {
        if (err) {
          logger.error('Failed to delete Item/ Item Not Found', 'listController: deleteItems()', 5);
          let apiResponse = response.generate(true, 'Failed to delete List', 400, null);
          reject(apiResponse);
        } else {
          resolve(data);
        }
      });
    });
  }


  itemToBeDeleted(req, res)
    .then((resolve) => {
      console.log("===============");
      console.log(resolve);
      console.log("===============");

      let apiResponse = response.generate(false, 'Item Deleted Succesfully', 200, resolve);
      res.status(200).send(apiResponse)
    })
    .catch((err) => {
      console.log(err);
      let apiResponse = response.generate(true, 'Failed to delete Item: Item Not found or There is some problem while deleting', 400, null);
      res.status(400).send(apiResponse)
    })
}

当我使用上面的代码访问API时,它会删除整个文档,并且为什么删除所有文档也是可以理解的。

我尝试过的另一个代码如下

let deleteItem = (req, res) => {
  let itemToBeDeleted = () => {
    return new Promise ((resolve, reject) => {
      listModel.update({ 'listItems.itemsId': { $in: [req.params.itemId] }}, { $pull: {itemsId: req.params.itemId }}, (err, data) => {
        if (err) {
          logger.error('Failed to delete Item/ Item Not Found', 'listController: deleteItems()', 5);
          let apiResponse = response.generate(true, 'Failed to delete List', 400, null);
          reject(apiResponse);
        } else {
          resolve(data);
        }
      });
    });
  }


  itemToBeDeleted(req, res)
    .then((resolve) => {
      console.log("===============");
      console.log(resolve);
      console.log("===============");
      let apiResponse = response.generate(false, 'Item Deleted Succesfully', 200, resolve);
      res.status(200).send(apiResponse)
    })
    .catch((err) => {
      console.log(err);
      let apiResponse = response.generate(true, 'Failed to delete Item: Item Not found or There is some problem while deleting', 400, null);
      res.status(400).send(apiResponse)
    })
}

这一次我尝试了问题Mongoose delete array element in document and save中提到的解决方案,但无法获得所需的解决方案。

1 个答案:

答案 0 :(得分:0)

let deleteItem = (req, res) => {
  let itemToBeDeleted = () => {
    return new Promise ((resolve, reject) => {
      listModel.updateOne(
        {listId: req.params.listId}, { $pull: { listItems: { itemsId: req.params.itemId } } }, (err, data) => {
          if (err) {
            console.log(err);
            reject(err);
          } else {
            resolve(data);
          }
        }
        );

    });
  }

  // calling promise
  itemToBeDeleted(req, res)
    .then((resolve) => {
      let apiResponse = response.generate(false, 'Item Deleted Succesfully', 200, resolve);
      res.status(200).send(apiResponse)
    })
    .catch((err) => {
      console.log(err);
      let apiResponse = response.generate(true, 'Failed to delete Item: Item Not found or There is some problem while deleting', 400, null);
      res.status(400).send(apiResponse)
    })
}

这是解决上述问题的代码。

我击中的Api是

http://localhost:3000/api/v1/list/items/delete/listId/itemsId