wertaer
разобрался
wertaer
я думал он как индентификатор
wertaer
работает
wertaer
а есть такой метод чтобы по индентификатору определял
wertaer
а как я хотел сделать тут
wertaer
@MrOnlineCoder ?
✙ Nikita
а есть такой метод чтобы по индентификатору определял
не совсем понимаю, скинь пример документа и какой параметр тебе нужно обновить
✙ Nikita
лучше конечно прислушаться к совету который раньше давали и пересмотреть твою схему
wertaer
я к нему
wertaer
прислушаюсь
wertaer
но я пока не особо понял
wertaer
что они имели ввиду
wertaer
посоветовали кейсы чекнуть
wertaer
посмотрю
wertaer
мб позже переделаю
wertaer
wertaer
вот пример
wertaer
нужно обновить допустим у 2(он неизвестный заранее, это для примера) обекта поле skillKDss на true
wertaer
вопщем так вот
✙ Nikita
если он неизвестнен
wertaer
его получают как callback_data у кнопки
wertaer
поэтому неизвестно какую кнопку нажмут и какой индентификатор прилетит
✙ Nikita
тебе нужно обновить тот скилл у которого в бд callback_data равен тому что прийдет в апдейте от телеграма?
wertaer
калбекдата должна совпадать с айди скилла в бд
wertaer
да
✙ Nikita
так с айди скилла или с полем callback_data ????? (на скрине равен flight 5)
wertaer
калбекдата должна совпадать с айди скилла в бд
на это не обращай внимания, вот как нужно
wertaer
callback_data у кнопки должна совпадать c ids скилла в бд
wertaer
еще точнее если то не понятно
wertaer
все
wertaer
я сделал
wertaer
...
wertaer
✙ Nikita
db.players.updateOne({name: 'Wertaer', 'skills.active.id': 1}, {$set: {'skills.active.$.damage': 10}})
✙ Nikita
как то так
✙ Nikita
вместо 1 ставишь свой
✙ Nikita
wertaer
спасибо
wertaer
што не поленился
wertaer
и помог
wertaer
wertaer
я так ебанул
wertaer
тоже сработало
wertaer
но эта выглядит короче
Alex
Всем привет! Как сделать проверку наличия объекта в массиве перед тем как обновить в нём запись? collectionDB.findOneAndUpdate( { "user": user }, { $set: { "departments.$[elem].lastMsgId": msg.lastMsgId }}, { arrayFilters: [ { "elem.departmentId": msg.departmentId } ] }, err => { if (err) console.error("\nERROR: Failed to add lastMsgId to DB \n", err) else console.log("Last message has been saved to history") }) Например, если объекта нет, то создать его, а если есть, то обновить.
wertaer
if(!object) добавить else не добавлять
wertaer
ну мб есть лучше способ
wertaer
ну это мне известный...
Alex
if(!object) добавить else не добавлять
collectionDB.findOneAndUpdate( { "user": user }, { $set: { "departments.$[elem].lastMsgId": msg.lastMsgId }}, { arrayFilters: [ { "elem.departmentId": msg.departmentId } ] }, (err, result) => { if (err) { return console.error("\nERROR: Failed to add lastMsgId to DB \n", err) } if (result) { const department = result.value.departments.find((item: AttachedInfoDepartmentsToUser) => item.departmentId === msg.departmentId) if (department) { console.log("Last message has been saved to history") } else { const newDepartment = { departmentId: msg.departmentId, lastMsgId: msg.lastMsgId, attached: false } collectionDB.findOneAndUpdate( { "user": user }, { $push: { "departments": newDepartment } }, err => { if (err) { return console.error("\nERROR: Failed to add lastMsgId to DB \n", err) } console.log("Last message has been saved to history") } ) } } })
Alex
Приходится 2 раза вызывать findOneAndUpdate
wertaer
А зачем
wertaer
Ты же ловишь ошибки
wertaer
В первом
wertaer
Запросе
Anonymous
Если юзаешь монгус, там upsert есть
Alex
А зачем
Мне нужно обновить объект в массиве - который в объекте, а если в нём нет того объекта, то создать его. Поэтому я сделал двойной вызов findOneAndUpdate, в result получаю этот массив и проверяю, был ли в нём этот объект, если был, значит обновилось, если нет то повторно вызываю findOneAndUpdate, но уже просто с $push.. ))
wertaer
А ну по-другому не выйдет
wertaer
wertaer
Ну мб более знающие люди
wertaer
Знают
Alex
Если юзаешь монгус, там upsert есть
Я для своего случая не нашёл примера, а тот который есть он только ищет объект в коллекции, а если его нет то создаёт: db.users.update({name : "Tom"}, {name: "Tom", age : 25}, {upsert: true}) В моём случае нужно найти объект в массиве - который в объекте... и если он есть, то обновить его, иначе создать новый. db.findOneAndUpdate( { "user": user }, { $set: { "departments.$[elem].lastMsgId": msg.lastMsgId }}, { arrayFilters: [ { "elem.departmentId": msg.departmentId } ] }, { upsert: true } ) Типа так но, это неправильно и не работает
Anonymous
похоже это невозможно за одну кверю https://stackoverflow.com/questions/39781173/update-nested-object-in-mongodb-if-it-exists-otherwise-add-it
Alex
похоже это невозможно за одну кверю https://stackoverflow.com/questions/39781173/update-nested-object-in-mongodb-if-it-exists-otherwise-add-it
Спасибо, видимо правильнее для монги создавать более простые объекты
Anonymous
Ребят, всем привет, кто может поделиться советом, есть коллекция ads, пример документа ad { "_id": "abc123", "created_at": "06.01.2021 08:00", "linked_project": "abcde12345", "conditions": [ { "on_top": 2, "total": 24, "price": 300 }, { "on_top": 3, "total": 72, "price": 500 } ] } в приложении хочу сделать http-handler для обновления определенного условия(conditions) типа: PUT https://api.example.com/advertisings/abc123/condition но объекты в массиве не имееют айдишников, что бы их найти вопрос, каким образом лучше смоделировать коллекцию , что бы можно было получать доступ к определенному условию?
Anonymous
генерить внутри каждого объекта condition поле id, по которому буду находить или лучше вынести conditions в отдельную коллекцию, которую уже при обращении буду дотаскивать, а в исходной коллекции буду держать просто линк(айдишники conditions)?
Anonymous
и доп вопрос: какая будет разница в производительности между { "_id": ObjectId(abc123), "on_top": 3, "total": 72, "price": 500 } и { "id": 1, incremental "on_top": 3, "total": 72, "price": 500 }
✙ Nikita
Привет, подскажите, есть поле типа дата, по нему я по делаю выборку за период (date: {$gte: start, $lte: end}). Какой индекс правильно делать для такого поля? По возрастанию или по убыванию? Или не имеет значения?
Dmitry
привет подскажите, пожалуйста, можно в агрегации в выборку (project) добавлять поля динамически?
Dmitry
например, выбрать все поля, которые начинаются с определенной комбинации символов (регулярное выражение)
Dmitry
смотрю в сторону $regexMatch, но опыта не хватает, чтобы собрать это всё в нормальный пайплайн
Nick
например, выбрать все поля, которые начинаются с определенной комбинации символов (регулярное выражение)
идея сама по себе немного упоротая, но решение можно получить с использованием https://docs.mongodb.com/manual/reference/operator/aggregation/objectToArray/ с последующей фильтрацией и сборкой обратно https://docs.mongodb.com/manual/reference/operator/aggregation/arrayToObject/
Владимир Т
Здравствуйте. Подскажите. Скачал mongodb 4.4.3 tgz и там нет mongodump mongorestore, как быть?
Гена
В 4.4+