|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Если за 0,0001 сек встретились 3 кода сохранения то этот случай надо читать в доках. В хибере настраивается перетирать старое или вызвать райзе или... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 15:45 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
PetroNotC Sharp miroooha, Я не понял что за парсер такой? Все работы с бд должны быть через одни ворота. Например hibernate. Если jdbc, то аккуратно и отдельный проект. Что за парсер? Да обыкновенный парсер веб-странички. У меня есть два вида поиска игры - по названию (если игра есть в БД) и по ссылке. Парсер работает по ссылке. Ты ему ссылку, а он тебе готовый объект с информацией об игре. После каждого запроса по ссылке объект сохраняется в БД, чтобы в дальнейшем игру можно было искать по названию. При использовании парсера я не беру информацию из БД, я её туда только кладу. А при поиске по названию из БД только беру. И вот возникает такая ситуация, что игра может быть уже в библиотеке (со старыми данными), и приходит запрос по ссылке (через парсер), и пытается сохранить (обновить) эту новую информацию в БД. Здесь у меня и был конфликт. Вот и приходится теперь сверять объекты. Точнее я теперь при возникновении этого исключения достаю из БД игру с таким же названием, беру у него этот уникальный id, через сеттер назначаю этот же самый айди объекту с новой информацией и отправляю в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 16:46 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
miroooha, ОК. Все верно ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 17:28 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
miroooha, а покажи туловище парсера. Что у тебя там? JSoup? HtmlCleaner? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 17:31 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
MongoDB не нужно использовать практически никогда. Это всё от нежелания учить SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 18:12 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
Возможно суммарная стоимость владения Монгой (если покупать ее как сервис у Амазона или Ажура) будет дешевле чем Postgres. Тогда пожалуй смысл есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 20:17 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
mayton miroooha, а покажи туловище парсера. Что у тебя там? JSoup? HtmlCleaner? Простейший парсер на jsoup: https://github.com/vonoriMMM/parser/blob/master/src/main/java/parser/googleplay/GooglePlayGamesParser.java Даже safe-методы написал во избежание NPE. Но его все равно придется переписывать (какую-то часть), как только структура страницы изменится. Была идея писать с помощью Selenium, но почему-то отказался, уж сам не помню из-за чего. dakeiras MongoDB не нужно использовать практически никогда. Это всё от нежелания учить SQL. Довольно спорное заявление, но я отказался от Postgres из-за того, что при деплоее на heroku там проблемы с подключением были. Мне также говорили, зачем я пишу бота на Java, когда есть Python? mayton Возможно суммарная стоимость владения Монгой (если покупать ее как сервис у Амазона или Ажура) будет дешевле чем Postgres. Тогда пожалуй смысл есть. Монго даёт БД (кластер) бесплатную (Mongo Cloud) с объемом в 512 МБ и 500 подключений. Причем можно выбирать хост: Google/AWS/Azure. Для моих нужд более чем. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 20:36 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
miroooha, что-то у вас много слов и мало кода никогда не испытывал проблем с upsert в MongoDB покажите код сохранения и почитайте документацию, тогда станет понятно, откуда берётся поле _id : The _id FieldIn MongoDB, each document stored in a collection requires a unique _id field that acts as a primary key. If an inserted document omits the _id field, the MongoDB driver automatically generates an ObjectId for the _id field. This also applies to documents inserted through update operations with upsert: true. The _id field has the following behavior and constraints:
отдельно обращу ваше внимание на последней строке в цитате: The _id field may contain values of any BSON data type, other than an array . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 20:57 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
miroooha Про второй случай. У меня же есть парсер, который по ссылке достаёт всю информацию об игре, которую я потом сохраняю в БД. Я знаю, что у меня в БД сейчас лежит объект, у которого тот же самый title, что и у игры, которую я парсю. Но одно поле у объекта, который лежит в БД и объекта, который я получил в ходе парсинга - разные. Т.е. по идее всё должно сработать как и в первом сценарии - перезаписаться одно поле. Но здесь получаю DuplicateKey. Значит в итоге вы делаете insert вместо update. Если надо обновить одно поле в документе с соответствующим title , то выполните update с нужным set : https://docs.mongodb.com/manual/reference/operator/update/set/ ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 21:06 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
Дмитрий Мух miroooha, что-то у вас много слов и мало кода никогда не испытывал проблем с upsert в MongoDB покажите код сохранения и почитайте документацию, тогда станет понятно, откуда берётся поле _id : The _id FieldIn MongoDB, each document stored in a collection requires a unique _id field that acts as a primary key. If an inserted document omits the _id field, the MongoDB driver automatically generates an ObjectId for the _id field. This also applies to documents inserted through update operations with upsert: true. The _id field has the following behavior and constraints:
отдельно обращу ваше внимание на последней строке в цитате: The _id field may contain values of any BSON data type, other than an array . Там почти нет кода. Используется готовый метод save() из MongoRepository. Я просто получаю объект из парсера и делаю на нём .save(). Я не писал реализацию для репозитория (интерфейса), используется дефолтная, так как думал, что для моих нужд этого будет достаточно, но возможно всё-таки придется, опыта набираться нужно. Id у меня сейчас типа ObjectId, который относится к BSON типу, если я не ошибаюсь. Проблема в обновлении в том, что там может быть такой сценарий, при котором надо обновлять не одно поле, а 10. Проще новый объект на место старого вставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 21:42 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
Код есть, но как я уже сказал он предельно прост: Сам документ: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Репа: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
Сохранение в БД (с подменой Id, описанной выше): Код: java 1. 2. 3. 4. 5. 6. 7. 8.
Знаю, что некрасиво (мне самому не нравится), но пока так. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2020, 21:49 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
miroooha Там почти нет кода. Используется готовый метод save() из MongoRepository. Я просто получаю объект из парсера и делаю на нём .save(). Я не писал реализацию для репозитория (интерфейса), используется дефолтная, так как думал, что для моих нужд этого будет достаточно, но возможно всё-таки придется, опыта набираться нужно. В том числе и изменить документ с таким-то title . Причём как весь объект, так и только часть полей. Все операции описаны в документации (например update ) и доступны через драйвер. MongoRepository - это обёртка над драйвером MongoDB. Предположу, что метод .save() работает исключительно по ключу (_id). И когда последний есть, то выполняется update , а когда нет, как при получении объекта из парсера, то insert . Отсюда вы и получаете DuplicateKey exception , потому как пытаетесь вставить новый документ, нарушающий уникальность индекса по полю title . Вам нужно выполнить update не по ключу, а по условию title равно что-то там. Посмотрите, если соответсвующий метод в вашем MongoRepository, возможно есть перегрузка метода .save(), принимающая не только документ, или аннотация какая. Если же нет, то придётся написать свою реализацию репозитория, или использовать драйвер напрямую. Вообщем читайте документацию как по MongoDB, так и по тем библиотекам, что используете для работы с ней. miroooha Id у меня сейчас типа ObjectId, который относится к BSON типу, если я не ошибаюсь. Среди которых и String , что также можно использовать в качестве значения _id . miroooha Проблема в обновлении в том, что там может быть такой сценарий, при котором надо обновлять не одно поле, а 10. Проще новый объект на место старого вставить? И при этом действительно проще новый объект на место старого вставить. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 14:38 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
miroooha Сохранение в БД (с подменой Id, описанной выше): Код: java 1. 2. 3. 4. 5. 6. 7. 8.
Знаю, что некрасиво (мне самому не нравится), но пока так. Да уж, вот вам ссылки на документацию по драйверу для Java: http://mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync/index.html http://mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 14:46 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
авторДовольно спорное заявление, но я отказался от Postgres из-за того, что при деплоее на heroku там проблемы с подключением были. Мне также говорили, зачем я пишу бота на Java, когда есть Python? Там на хероку всё автоматом подключается в Postgresql. А спорить не надо. Я знаю о чём говорю и это подтверждено опытом. Mongodb приводит к очень плачевным результатам. Хотя не так. Нежелание учиться и лень приводят к очень плачевным результатам. Python говно хуже явы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 16:58 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
dakeiras Mongodb приводит к очень плачевным результатам. Интересно к каким? 6 лет как у нас MongoDB вполне успешно используется в продакшене. Да, надо знать как оно устроено и как с ним работать. А если что-то не уметь готовить, тогда да, результаты будут плачевные, в том числе и с Postgres. Который мы кстати тоже вполне успешно используем в продакшене :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:12 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
Дмитрий Мух , спасибо за разъяснения! Покопаюсь в документации. Пока посмотрел метод save MongoRepository. С дефолтной реализацией он работает так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вызывается или insert, если такой entity нет, либо save класса MongoTemplate. Ну а там уже реализация посложнее, сходу не разобрался. Единственное, в этом методе save активно мелькает id. Код: java 1.
А в saveDocument такое дело: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Дальше лезть ёщё страшнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:21 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
Дмитрий Мух dakeiras Mongodb приводит к очень плачевным результатам. Интересно к каким? 6 лет как у нас MongoDB вполне успешно используется в продакшене. Да, надо знать как оно устроено и как с ним работать. А если что-то не уметь готовить, тогда да, результаты будут плачевные, в том числе и с Postgres. Который мы кстати тоже вполне успешно используем в продакшене :) я получил систему завязанную на монго, где он был не к месту. А как и в 90% случаев к месту была бы SQL база. Пришлось к ней писать доп. систему с человеческой SQL базой. Это спасло от многомилионных убытков. (Но не надолго как показала практика). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:28 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
авторДа, надо знать как оно устроено и как с ним работать. кстати, как в этом монго сделать так чтобы большой объект файл с записями 100мб можно было сохранять? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:30 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
miroooha Дмитрий Мух , спасибо за разъяснения! Покопаюсь в документации. Пока посмотрел метод save MongoRepository. С дефолтной реализацией он работает так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вызывается или insert, если такой entity нет, либо save класса MongoTemplate. Ну а там уже реализация посложнее, сходу не разобрался. Единственное, в этом методе save активно мелькает id. Код: java 1.
А в saveDocument такое дело: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Дальше лезть ёщё страшнее. Ну видно же, что если isNew(entity), то insert. Если нет id, то тоже insert. Что и требовалось доказать Отсюда и DuplicateKey exception по title. Вам по идее вместо mapped.getIdFilter() нужен некий mapped.getTitleFilter(), тогда выполнив: Код: java 1.
вы получите то, что вам нужно: нет документа с таким title, он добавится; есть - обновится. На writeConcern не обращайте внимание, оно вам не надо. Разве что можете в документации почитать, что это такое и когда следует использовать: https://docs.mongodb.com/manual/reference/write-concern/ ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:33 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
dakeiras авторДа, надо знать как оно устроено и как с ним работать. кстати, как в этом монго сделать так чтобы большой объект файл с записями 100мб можно было сохранять? Как как... GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:35 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
dakeiras Дмитрий Мух пропущено... Интересно к каким? 6 лет как у нас MongoDB вполне успешно используется в продакшене. Да, надо знать как оно устроено и как с ним работать. А если что-то не уметь готовить, тогда да, результаты будут плачевные, в том числе и с Postgres. Который мы кстати тоже вполне успешно используем в продакшене :) я получил систему завязанную на монго, где он был не к месту. А как и в 90% случаев к месту была бы SQL база. Пришлось к ней писать доп. систему с человеческой SQL базой. Это спасло от многомилионных убытков. (Но не надолго как показала практика). То есть вам досталась система на MongoDB, вы перенесли её на SQL базу... И в итоге получили убытки? Простите, но мне видится, что проблема тут не в MongoDB. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:38 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
Дмитрий Мух dakeiras пропущено... кстати, как в этом монго сделать так чтобы большой объект файл с записями 100мб можно было сохранять? Как как... GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB. я это видел. Как существующую базу\приложение на это мигрировать? авторТо есть вам досталась система на MongoDB, вы перенесли её на SQL базу... И в итоге получили убытки? Простите, но мне видится, что проблема тут не в MongoDB. Не перенесли а дуплицировали данные, OLAP. Но проблема и правда не в монго, как я выше и написал. Проблема в том что не нужно было его использовать изначально. Это объектная БД, она не приспособлена для 90% случаев работы например в банковоской сфере. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:44 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
dakeiras Дмитрий Мух пропущено... Как как... GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB. я это видел. Как существующую базу\приложение на это мигрировать? Тут я вам сходу не скажу, я же не видел вашу базу\приложение. Вопрос из разряда: как мигрировать приложение, что хранит файлы на сетевой шаре в Amazon S3. Зависит от того, как это самое приложение спроектировано и реализовано. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:50 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
Мне кажется что количество "миграторов" в нашем мире пропорционально количеству систем в квадрате. А квадрат - это нехорошее число. Растет слишком резко. Не угонимся за всеми. Тогда вместо того чтобы гуглить или ждать специфичный мигратор, можно взять ... и написать свой. Я не думаю что это сложно. На мой взгляд - курсовая для 2 курса факультета ПО. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:55 |
|
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
|
|||
---|---|---|---|
#18+
mayton Я не думаю что это сложно. На мой взгляд - курсовая для 2 курса факультета ПО. Мне вот тоже кажется, что это не сложно, если приложение хорошо спроектировано. Если же там некий SmartUI монолит, это уже вопрос ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 17:58 |
|
|
start [/forum/topic.php?fid=59&msg=39974979&tid=2120753]: |
0ms |
get settings: |
14ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
31ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
481ms |
get tp. blocked users: |
1ms |
others: | 302ms |
total: | 840ms |
0 / 0 |