mongodb, express.js . Добавить новый документ в массив документов селектор id

#mongodb #express #mongodb-query

#mongodb #выражать #mongodb-запрос

Вопрос:

Я хочу добавить новый документ в массив документов. Поэтому я передаю свой параметр, который является _id документа, к которому я хочу добавить. Затем мне нужно просто добавить его в массив. Я думал, что у меня это работает, но на самом деле это было добавление вложенного массива к этому массиву. Я понял это, потому что я также пытаюсь отсортировать его так, чтобы недавно добавленные документы были вверху. Так что в итоге мне пришлось вернуться назад и попытаться исправить свой запрос add. На данный момент он в основном просто говорит, что не может добавлять значения. Вот почему я использую mongodb client, express, await.

Я просматривал руководство mongodb и пробовал то, что у них есть, но не могу заставить его работать, очевидно, что-то не так с моим добавлением нового документа. Кто-нибудь видит проблему или показывает мне пример? Спасибо!

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

Используя post man, вот как выглядит мой json и как выглядит массив документов, к которому я пытаюсь добавить.

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

Комментарии:

1. Вы когда-нибудь задумывались о том, чтобы удалить этот документ, который вы хотите отредактировать, и сохранить его в памяти, а затем выполнить все необходимые манипуляции, просто обновите весь документ после завершения

2. нет, я просто подумал написать запрос и добавить новые значения, подумал, что это достаточно простая задача, но я также новичок в mongodb. Я в основном использовал sql

Ответ №1:

  • выполняйте подключение mongodb вне функции, не нужно каждый раз подключаться и отключаться при вызове функции, не создавайте слишком много необычных переменных.
  • для push-объекта вам необходимо указать имя основного ключа и назначить ему объект.
 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 });
    }

});
 

Комментарии:

1. ах, я понял. Что ж, я смог извлечь уроки из того, что вы предоставили, и успешно добавить к нему объект. Почему вы индексируете 0?

2. Я думал, что вы передаете массив, который я только что исправил.

3. в принципе, добавляя что-то вроде этого, let string = {author: «myname», comment: «mycomment»}; но индексируя его, как вы, смогу ли я поместить недавно добавленный документ в нужный индекс? Nm попробовал и ничего не делает

4. о каком индексе вы говорите, об comments индексе элемента массива? никакой $push не добавит объект в конец массива. означает последний элемент.

5. да, я думал, что, изменив индекс, он подтолкнет его к этому индексу, но это ничего не дало