mongodb, express.js. Ajouter un nouveau document au tableau de documents Le sélecteur est id

Nov 26 2020

Je souhaite ajouter un nouveau document à un tableau de documents. Je passe donc mon paramètre qui est le _id du document auquel je veux ajouter. Ensuite, je dois simplement l'ajouter au tableau. Je pensais que cela fonctionnait, mais cela ajoutait en fait un tableau imbriqué à ce tableau. J'ai réalisé cela parce que j'essaie également de le trier afin que les documents nouvellement ajoutés soient en haut. J'ai donc fini par devoir revenir en arrière et essayer de corriger ma requête d'ajout. À partir de maintenant, il dit simplement ne peut pas ajouter de valeurs. C'est pourquoi j'utilise le client mongodb, express, await.

J'ai regardé le manuel de mongodb et essayé ce qu'ils ont mais je ne peux pas le faire fonctionner, évidemment quelque chose ne va pas avec l'ajout d'un nouveau document. Quelqu'un voit-il le problème ou me montre-t-il un exemple? Merci!

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();
    }
});

En utilisant post man, voici à quoi ressemble mon json et à quoi ressemble le tableau de documents que j'essaie d'ajouter.

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

Réponses

turivishal Nov 26 2020 at 21:42
  • faites la connexion mongodb en dehors de la fonction, pas besoin de vous connecter et de vous déconnecter à chaque fois que vous appelez la fonction, ne créez pas trop de variables inhabituelles.
  • pour l'objet push, vous devez fournir le nom de la clé principale et lui attribuer un objet.
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 });
    }

});