#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. да, я думал, что, изменив индекс, он подтолкнет его к этому индексу, но это ничего не дало