mongodb, express.js. Agregar nuevo documento a la matriz de documentos selector es id

Nov 26 2020

Quiero agregar un nuevo documento a una serie de documentos. Entonces paso mi parámetro, que es el _id del documento al que quiero agregar. Entonces necesito agregarlo a la matriz. Pensé que lo tenía funcionando, pero en realidad estaba agregando una matriz anidada a esa matriz. Me di cuenta de esto porque también estoy tratando de ordenarlo para que los documentos recién agregados estén en la parte superior. Así que terminé teniendo que volver e intentar corregir mi consulta de adición. A partir de ahora, básicamente dice que no se pueden agregar valores. Es por eso que he estado usando el cliente mongodb, express, await.

He estado mirando el manual de mongodb y probando lo que tienen, pero no puedo hacer que funcione, obviamente hay algo mal con mi adición de un nuevo documento. ¿Alguien vio el problema o me mostró un ejemplo? ¡Gracias!

app.post("/addComment/:id", async (request, response) => {
    let mongoClient = new MongoClient(URL, { useUnifiedTopology: true });
    try {
        await mongoClient.connect(); 
        let id = new ObjectId(request.sanitize(request.params.id));

       
        request.body.comments = { $push: {"comments.author": "myTestPOSTMAN - 1", "comments.comment": "myTestCommPostMan - 1"}}; let selector = { "_id":id }; //let newValues = {$push: {"comments.comment": "myTestCommPostMan - 1", "comments.author": 
        "myTestPOSTMAN - 1"}};
        let newValues = request.body.comments;
        let result = await mongoClient.db(DB_NAME).collection("photos").updateOne(selector, 
        newValues);

        if (JSON.parse(result).n <= 0) {
            response.status(404);
            response.send({error: "No documents found with ID"});
            mongoClient.close();
            return;
        }
        response.status(200);
        response.send(result);     
    } catch (error) {
        response.status(500);
        response.send({error: error.message});
        throw error;
    } finally {
        mongoClient.close();
    }
});

Usando post man, así es como se ve mi json y cómo se ve la matriz de documentos que estoy tratando de agregar.

 {"comments": [
                {
                    "comment": "pm - test3",
                    "author": "pm - test4"
                }
            ]
        }

Respuestas

turivishal Nov 26 2020 at 21:42
  • Realice la conexión mongodb fuera de la función, no es necesario conectarse y desconectarse cada vez que se llama a la función, no cree demasiado variables inusuales.
  • para el objeto de inserción, debe proporcionar el nombre de la clave principal y asignarle el objeto.
let mongoClient = new MongoClient(URL, { useUnifiedTopology: true });
await mongoClient.connect();
app.post("/addComment/:id", async (request, response) => {

    try {

        let result = await mongoClient.db(DB_NAME).collection("photos").updateOne(
            { "_id": new ObjectId(request.sanitize(request.params.id)) }, 
            { $push: { comments: request.body.comments } }
        );
        if (JSON.parse(result).n <= 0) {
            response.status(404).send({ error: "No documents found with ID" });
            return;
        }
        response.status(200).send(result);

    } catch (error) {
        response.status(500).send({ error: error.message });
    }

});