mongodb, express.js. Adicionar novo documento ao seletor de matriz de documentos é id

Nov 26 2020

Quero adicionar um novo documento a uma série de documentos. Então, passo meu parâmetro, que é o _id do documento que desejo adicionar. Então eu preciso apenas adicioná-lo ao array. Achei que estava funcionando, mas na verdade ele estava adicionando uma matriz aninhada a essa matriz. Percebi isso porque também estou tentando classificá-los para que os documentos recém-adicionados fiquem no topo. Então, acabei tendo que voltar e tentar corrigir minha consulta de adição. A partir de agora, basicamente diz que não é possível adicionar valores. É por isso que tenho usado o cliente mongodb, express, await.

Estive olhando o manual do mongodb e tentando o que eles têm, mas não consigo fazê-lo funcionar, obviamente, algo errado com a minha adição de um novo documento. Alguém viu o problema ou me mostrou um exemplo? Obrigado!

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 o post man, essa é a aparência do meu json e a aparência da matriz de documentos que estou tentando adicionar.

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

Respostas

turivishal Nov 26 2020 at 21:42
  • faça a conexão mongodb fora da função, não há necessidade de conectar e desconectar toda vez que a função for chamada, não crie variáveis ​​incomuns demais.
  • para o objeto push, você precisa fornecer o nome da chave principal e atribuir o objeto a ela.
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 });
    }

});