Traté de encontrar las soluciones aquí, pero no pude tener éxito al usar $pull ya que los valores de matriz que tengo no contienen `mongo_id'.
Entonces, el escenario es que estoy tratando de eliminar el comentario específico del usuario en particular que estoy pasando a través de los parámetros de consulta. METRO
Mis datos de mongo se ven así:
Ahora estoy haciendo una solicitud de eliminación de API como esta: http://localhost:8000/api/articles/learn-react/delete-comment?q=1 en mi host local.
Y finalmente mi código se ve así:
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); }); He usado la función de filter , pero no muestra ningún error en la terminal, sino que también obtiene el estado 500 en el cartero.
¿No puede averiguar el error?
Creo que encontrarás una buena respuesta aquí: https://stackoverflow.com/a/4588909/9951599
Algo a tener en cuenta...
Puede utilizar los métodos de proyección integrados de MongoDB para simplificar su código. https://docs.mongodb.com/manual/reference/operator/projection/positional/#mongodb-projection-proj.-
Al asignar una "ID única" a cada uno de sus comentarios, puede encontrar/modificar el comentario rápidamente usando un comando de actualización en lugar de extraer el comentario por orden en la matriz. Esto es más eficiente y mucho más simple. Además, varias lecturas/escrituras a la vez no interferirán con esta lógica durante las horas punta, lo que garantiza que siempre elimine el comentario correcto.
Solución #1: La forma recomendada, con operadores atómicos
Así es como puede dejar que MongoDB lo extraiga por usted si le da una identificación a cada uno de sus comentarios.
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 } });Solución #2 - No recomendado
Alternativamente, puede eliminarlo por índice:
// I'm using "3" here staticly, put the index of your comment there instead. db.collection('articles').updateOne({ name:articleName }, { $unset : { "comments.3":0 } })No sé por qué su filtro está fallando, pero recomendaría omitir el filtro por completo e intentar utilizar el sistema atómico de MongoDB para usted.