0

I tried to find the solutions over here but unable to get success while using $pull as the array values I have does not contain `mongo_id'.

So the scenario is that , I am trying to delete the specific comment of the particular user which I am passing through query params. M

My mongo data looks like this:

enter image description here

Now I am making API Delete request like this : http://localhost:8000/api/articles/learn-react/delete-comment?q=1 on my localhost .

ANd finally my code looks like this:

import express from "express";
import bodyParser from "body-parser";
import { MongoClient } from "MongoDB";



const withDB = async (operations, res) => {
try {
  const client = await MongoClient.connect(
  "mongodb://localhost:27017",
  { useNewUrlParser: true },
  { useUnifiedTopology: true }
 );
  const db = client.db("my-blog");

  await operations(db);

  client.close();
  } catch (error) {
   res.status(500).json({ message: "Error connecting to db", error });
  }
 };


app.delete("/api/articles/:name/delete-comment", (req, res) => {
 const articleName = req.params.name;
 const commentIndex = req.query.q;

 withDB(async(db) => {
   try{
     const articleInfo = await db.collection('articles').findOne({name:articleName});
     let articleAllComment = articleInfo.comments;
     console.log("before =",articleAllComment)
     const commentToBeDeleted = articleInfo.comments[commentIndex];
     //console.log(commentToBeDeleted)
     // articleAllComment.update({
     //   $pull: { 'comments':{username: commentToBeDeleted.username }}
     // });
     articleAllComment = articleAllComment.filter( (item) => item != commentToBeDeleted );
     await articleAllComment.save();

     console.log("after - ",articleAllComment);
     //yaha per index chahiye per kaise milega pta nhi?
     //articleInfo.comments = gives artcle comment
     res.status(200).send(articleAllComment);
   }
   catch(err)
   {
     res.status(500).send("Error occurred")
   }
   },res);

 });

I have used the filter function but it is not showing any error in terminal but also getting 500 status at postman.

Unable to figure out the error?

enter image description here

MagnusEffect
  • 3,363
  • 1
  • 16
  • 41

1 Answers1

0

I believe you'll find a good answer here: https://stackoverflow.com/a/4588909/9951599

Something to consider...

You can use MongoDB's built-in projection methods to simplify your code. https://docs.mongodb.com/manual/reference/operator/projection/positional/#mongodb-projection-proj.-

By assigning a "unique ID" to each of your comments, you can find/modify the comment quickly using an update command instead of pulling out the comment by order in the array. This is more efficient, and much simpler. Plus, multiple read/writes at once won't interfere with this logic during busy times, ensuring that you're always deleting the right comment.

Solution #1: The recommended way, with atomic operators

Here is how you can let MongoDB pull it for you if you give each of your comments an ID.

await db.collection('articles').updateOne({ name:articleName },
{
    $pull:{ "comments.id":commentID }
});
// Or
await db.collection('articles').updateOne({ name:articleName, "comments.id":commentID },
{
    $unset:{ "comments.$":0 }
});

Solution #2 - Not recommended

Alternatively, you could remove it by index:

// I'm using "3" here staticly, put the index of your comment there instead.
db.collection('articles').updateOne({ name:articleName }, {
    $unset : { "comments.3":0 }
})

I do not know why your filter is erroring, but I would recommend bypassing the filter altogether and try to utilize MongoDB's atomic system for you.

Alex Navarro
  • 118
  • 6
  • Although I am tryimg to delete without using findByIdandDelete(); But I am exploring other methods too. Coming to your answer, i.e. in `Solution#2` , you have statically used 3 but I have a variable `commentIndex` ,then how can I use it here,??? db.collection('articles').updateOne({ name:articleName }, { $unset : { `comments.${commentIndex}`:0 } }) I used it like above by using backticks & dollar like we do in javascript? – MagnusEffect Oct 13 '21 at 00:07
  • Also your method 2 making null values which is creating problem – MagnusEffect Oct 13 '21 at 00:12