mongodb, express.js. Dodaj nowy dokument do tablicy selektorów dokumentów to id

Nov 26 2020

Chcę dodać nowy dokument do tablicy dokumentów. Więc przekazuję swój parametr, którym jest _id dokumentu, do którego chcę dodać. Następnie muszę po prostu dodać go do tablicy. Myślałem, że mam to działające, ale w rzeczywistości było to dodawanie zagnieżdżonej tablicy do tej tablicy. Zdałem sobie z tego sprawę, ponieważ próbuję to również posortować, więc nowo dodane dokumenty są na górze. Skończyło się na tym, że musiałem wrócić i spróbować naprawić moje zapytanie dotyczące dodawania. Na razie po prostu mówi, że nie można dodawać wartości. Dlatego korzystam z klienta mongodb, express, await.

Przeglądałem podręcznik mongodb i próbowałem tego, co mają, ale nie mogę go uruchomić, oczywiście coś jest nie tak z moim dodaniem nowego dokumentu. Czy ktoś widzi problem lub pokaże mi przykład? Dzięki!

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

Używając post man, tak wygląda mój json i jak wygląda tablica dokumentów, do których próbuję dodać.

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

Odpowiedzi

turivishal Nov 26 2020 at 21:42
  • wykonaj połączenie mongodb poza funkcją, nie musisz łączyć się i rozłączać za każdym razem, gdy wywoływana jest funkcja, nie twórz zbyt często niezwykłych zmiennych.
  • dla obiektu push należy podać nazwę klucza głównego i przypisać do niego obiekt.
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 });
    }

});