powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
78 сообщений из 78, показаны все 4 страниц
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39973937
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подключил к своему проекту MongoDB (Mongo Cloud) и складываю туда объекты в виде документов.

Репозиторий для общения с БД:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Repository
public interface GooglePlayGamesRepository extends MongoRepository <GooglePlayGame, String> {

    GooglePlayGame findByTitleIgnoreCase(String gameTitle);

    @Aggregation("{$sample: {size: ?0} }")
    List<GooglePlayGame> findRandomGames(Long amount);

    List<GooglePlayGame> findByTitleContainsIgnoreCase(String gameTitle);

}


Сам объект, который сохраняю:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
import org.springframework.data.annotation.Id;

@Document(collection = "googleplaygames")
@Getter
@Component
public final class GooglePlayGame implements Serializable {

    @Id
    String title; //это уникальный ключ!
    String genre;
    String price;
...
}



Если сохранять объект в таком виде, в коллекции MongoDB поле title заменяется на _id , а title просто становится null и никак не отображается в коллекции, так как если пробую добавить ещё одну игру, вылетает exception:
Код: java
1.
org.springframework.dao.DuplicateKeyException: E11000 duplicate key error collection: 5ef31a21233f9c398f473c6e_botapi.googleplaygames index: title dup key: { title: null };


Если убрать аннотацию @Id, то в коллекции будут храниться дубликаты и будет две одинаковых игры, у которых отличается поле "номер версии". Мне игра нужна в единственном экземпляре: если у игры, например, изменился номер версии, я хочу перезаписать этот объект (если он уже есть в БД) с новой версией.

Пробовал с помощью аннотации @Indexed(unique = true) на поле. В таком случае другие игры добавляются, но если я пробую перезаписать старый объект с таким же полем, то также получаю DuplicateKey.

Для сохранения в БД использую метод save.

Как быть? Писать ручками запрос?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974038
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974134
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
miroooha,

https://www.google.com/search?newwindow=1&client=tablet-android-huawei&ei=NHD5Xs3kBcHIrgTTwYDgDw&q=mongo cloud id primary key&oq=Mongo Cloud id primary&gs_lcp=ChNtb2JpbGUtZ3dzLXdpei1zZXJwEAEYADIFCCEQoAE6BAgAEEc6BAgAEAo6AggAOggIABAWEAoQHjoICCEQFhAdEB46BQgAEM0COgcIIRAKEKABUJ8xWM6zAWD9wgFoA3ABeACAAaIKiAHFJpIBDzAuMi41LjIuMC4xLjEuMZgBAKABAQ&sclient=mobile-gws-wiz-serp
?

Primary Key - это и есть аннотация @Id у меня в примере. И с ней не работает. Он смотрит, что я добавляю объект с таким же полем и тут же DuplicationError, не смотря на то, что другие поля уже отличаются.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974136
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В доках написано, что метод save работает как insert, если такого документа нет, и как update, если документ уже есть. Но кто-то меня обманывает, либо что-то недоговаривает. Никакого update у меня не происходит.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974145
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,
Значит ссылку где обманывают сюда. И код тоже сюда.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974146
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,
Там в веб в примере id строковый тип?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974150
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
miroooha,
Значит ссылку где обманывают сюда. И код тоже сюда.

https://www.concretepage.com/spring-5/spring-data-mongorepository-update#save

В подобных примерах в основном числовой тип, а не строковый. У меня же строка.

Да и этот метод save() наследуется от CrudRepository. И опять же, пишут, что он работает и как update, например тут:
https://www.baeldung.com/spring-data-crud-repository-save
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974179
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,

>В подобных примерах в основном числовой тип, а не строковый. У меня же строка.
Вот и сделай числовой. И потом с примером сюда.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974279
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
miroooha,

>В подобных примерах в основном числовой тип, а не строковый. У меня же строка.
Вот и сделай числовой. И потом с примером сюда.

А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974292
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно
вообще-то это первое дело в таблицах иметь поде id primary key
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974293
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно
вообще-то это первое дело в таблицах иметь поде id primary key
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974299
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
miroooha
А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно
вообще-то это первое дело в таблицах иметь поде id primary key

Оно обязательно должно быть числом? У меня есть primary key, который весит на стринге. Мне предлагают снять этот primary key с этой стринги, ввести доп.поле числового типа и повесить на него pk.

Ну я буду пробовать, потом отпишусь о результатах.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974375
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Оно обязательно должно быть числом?
если ты хочешь иметь тормоза - то можешь что угодно использовать.
кроме этого поле primary key делают автоинкриментным
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974379
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,
Долго пробуешь.
Заработает, поставишь строковое. Делов то.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974390
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно title не выбирают на роль уникального ключа. По смыслу - он больше атрибут. Или комментарий.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974562
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя
miroooha
Оно обязательно должно быть числом?
если ты хочешь иметь тормоза - то можешь что угодно использовать.
кроме этого поле primary key делают автоинкриментным

Ну это понятно, что сравнить два числа гораздо быстрее, чем строку.

Попробовал так:
Вручную ввел доп.поле типа ObjectId, которое генерит сама монго, если не видит аннотации @Id. Повесил на неё @Id, а на название повесил индекс на уникальность. Проверил: взял объект из БД, через сеттер изменил одно из полей и попробовал сохранить измененный объект - всё прошло успешно.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import org.bson.types.ObjectId;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;

...

@Id
ObjectId id;
@Indexed(unique = true)
String title;



Окей, объект изменился, никаких дубликат error.

Однако, дальше через свой парсер снова пытаюсь сохранить объект (у которого это измененное поле уже другое) - и снова ничего не работает! Чудеса да и только.

Если брать объект из БД, менять через сеттер ему поле, и сохранять обратно - то всё работает. А как только пытаюсь сохранить готовый объект (у которого новое значение в поле) - так снова DuplicateKey.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974563
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,
Второй нерабочий случай не понял.
Транзакция должна быть короткой 0,1сек.
С коммитом.
Поле id менять нельзя.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974568
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
miroooha,
Второй нерабочий случай не понял.
Транзакция должна быть короткой 0,1сек.
С коммитом.
Поле id менять нельзя.

Ну в первом случае я взял объект с игрой из БД, сохранил его в локальную переменную, через сеттер изменил значение одного поля и тут же через метод save() сохранил в БД. В результате у этого объекта в БД изменилось соответствующее поле - т.е. то, чего я и добивался.

Про второй случай. У меня же есть парсер, который по ссылке достаёт всю информацию об игре, которую я потом сохраняю в БД. Я знаю, что у меня в БД сейчас лежит объект, у которого тот же самый title, что и у игры, которую я парсю. Но одно поле у объекта, который лежит в БД и объекта, который я получил в ходе парсинга - разные.
Т.е. по идее всё должно сработать как и в первом сценарии - перезаписаться одно поле. Но здесь получаю DuplicateKey.

P.S. Т.е. если я в будущем захочу обновить игру в БД по одной ссылке и 1 запросу с парсера, если у неё условно сменится номер, или цена, то я получу ошибку.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974572
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Грубо говоря, он не хочет просто взять и "переписать" старый объект на новый, у которого новые значения. Надо взять уже имеющийся объект и БД, изменить ему поля и закинуть его обратно. Не очень удобно для моего сценария.

Особенности NoSQL? Mongo? Или моих кривых рук? С Postgres всё работало по описанному сценарию.

Я уже понимаю, что похоже загвоздка в id, так как при парсинге создаётся новый объект. Он видит, что у объектов разные id, но одинаковые поля title и не пускает. Но как её решить..
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974582
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При каждом запросе залезать в БД и проверять, есть ли там такая игра. Если есть, то достать и сравнить с той, что выдал парсер. Прогнать и сравнить через equals, и в случае несовпадения заменить через сеттер соответствующие поля и обновить объект в БД. Как-то не комильфо.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974597
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miroooha
При каждом запросе залезать в БД и проверять, есть ли там такая игра. Если есть, то достать и сравнить с той, что выдал парсер. Прогнать и сравнить через equals, и в случае несовпадения заменить через сеттер соответствующие поля и обновить объект в БД. Как-то не комильфо.

Ещё один костыль, который только что испробовал: при попытке сохранить объект в БД ловить этот exception на дубликат. В catch блоке во временную переменную складывать объект из БД с таким же названием. Доставать у него этот уникальный id, и через сеттер ставить тому объекту, который пытаюсь сохранить. В результате объект в БД обновляется. Но как-то мне не очень нравится такой вариант (но хоть работает) :D
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974606
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотреть, чем "объект из БД" отличается от того, что ты пытаешься пихать, не судьба?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974610
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
Посмотреть, чем "объект из БД" отличается от того, что ты пытаешься пихать, не судьба?

Я это только что выше в принципе и описал.
Просто завернул в catch, чтобы проверять что там нового только в том случае, если такой объект уже есть (при DuplicateKeyExсeption). Проверять каждый нет необходимости.

Просто при работе с Postgres таких проблем не было, он сам всё решал за меня. А здесь вот так вот выходит.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974633
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
При каждом запросе залезать в БД и проверять, есть ли там такая игра. Если есть, то достать и сравнить с той, что выдал парсер. Прогнать и сравнить через equals, и в случае несовпадения заменить через сеттер соответствующие поля и обновить объект в БД. Как-то не комильфо.

Вы много думаете.
При ОРМ не надо жалеть комп и много думать.
Именно так!
Читаем ПОСЛЕДНЮЮ версию объекта и меняем за 0, 00001 сек.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974635
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,
Я не понял что за парсер такой?
Все работы с бд должны быть через одни ворота. Например hibernate.
Если jdbc, то аккуратно и отдельный проект.
Что за парсер?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974638
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
Если за 0,0001 сек встретились 3 кода сохранения то этот случай надо читать в доках. В хибере настраивается перетирать старое или вызвать райзе или...
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974686
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
miroooha,
Я не понял что за парсер такой?
Все работы с бд должны быть через одни ворота. Например hibernate.
Если jdbc, то аккуратно и отдельный проект.
Что за парсер?

Да обыкновенный парсер веб-странички. У меня есть два вида поиска игры - по названию (если игра есть в БД) и по ссылке. Парсер работает по ссылке. Ты ему ссылку, а он тебе готовый объект с информацией об игре. После каждого запроса по ссылке объект сохраняется в БД, чтобы в дальнейшем игру можно было искать по названию. При использовании парсера я не беру информацию из БД, я её туда только кладу. А при поиске по названию из БД только беру.

И вот возникает такая ситуация, что игра может быть уже в библиотеке (со старыми данными), и приходит запрос по ссылке (через парсер), и пытается сохранить (обновить) эту новую информацию в БД. Здесь у меня и был конфликт.
Вот и приходится теперь сверять объекты. Точнее я теперь при возникновении этого исключения достаю из БД игру с таким же названием, беру у него этот уникальный id, через сеттер назначаю этот же самый айди объекту с новой информацией и отправляю в БД.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974705
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,

ОК. Все верно
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974708
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha, а покажи туловище парсера. Что у тебя там? JSoup? HtmlCleaner?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974730
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MongoDB не нужно использовать практически никогда. Это всё от нежелания учить SQL.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974776
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно суммарная стоимость владения Монгой (если покупать ее как сервис у Амазона или Ажура)
будет дешевле чем Postgres. Тогда пожалуй смысл есть.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974782
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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. Для моих нужд более чем.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974787
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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:
  • By default, MongoDB creates a unique index on the _id field during the creation of a collection.
  • The _id field is always the first field in the documents. If the server receives a document that does not have the _id field first, then the server will move the field to the beginning.
  • The _id field may contain values of any BSON data type, other than an array.
https://docs.mongodb.com/manual/core/document/

отдельно обращу ваше внимание на последней строке в цитате: The _id field may contain values of any BSON data type, other than an array .
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974788
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Про второй случай. У меня же есть парсер, который по ссылке достаёт всю информацию об игре, которую я потом сохраняю в БД. Я знаю, что у меня в БД сейчас лежит объект, у которого тот же самый title, что и у игры, которую я парсю. Но одно поле у объекта, который лежит в БД и объекта, который я получил в ходе парсинга - разные.
Т.е. по идее всё должно сработать как и в первом сценарии - перезаписаться одно поле. Но здесь получаю DuplicateKey.

Значит в итоге вы делаете insert вместо update.

Если надо обновить одно поле в документе с соответствующим title , то выполните update с нужным set :

https://docs.mongodb.com/manual/reference/operator/update/set/
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974795
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух
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:
  • By default, MongoDB creates a unique index on the _id field during the creation of a collection.
  • The _id field is always the first field in the documents. If the server receives a document that does not have the _id field first, then the server will move the field to the beginning.
  • The _id field may contain values of any BSON data type, other than an array.
https://docs.mongodb.com/manual/core/document/

отдельно обращу ваше внимание на последней строке в цитате: The _id field may contain values of any BSON data type, other than an array .
Там почти нет кода. Используется готовый метод save() из MongoRepository. Я просто получаю объект из парсера и делаю на нём .save().
Я не писал реализацию для репозитория (интерфейса), используется дефолтная, так как думал, что для моих нужд этого будет достаточно, но возможно всё-таки придется, опыта набираться нужно.

Id у меня сейчас типа ObjectId, который относится к BSON типу, если я не ошибаюсь.

Проблема в обновлении в том, что там может быть такой сценарий, при котором надо обновлять не одно поле, а 10. Проще новый объект на место старого вставить?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974796
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код есть, но как я уже сказал он предельно прост:
Сам документ:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "googleplaygames")
@Builder(builderClassName = "GooglePlayGameBuilder", toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@Getter
@FieldDefaults(level = AccessLevel.PRIVATE)
public final class GooglePlayGame implements Serializable {
    @Id
    ObjectId id;
    @Indexed(unique = true)
    String title;
    String currentVersion
...


Репа:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Repository
public interface GooglePlayGamesRepository extends MongoRepository <GooglePlayGame, String> {

    @Aggregation("{$sample: {size: ?0} }")
    List<GooglePlayGame> findRandomGames(Long amount);

    List<GooglePlayGame> findByTitleContainsIgnoreCase(String gameTitle);

}


Сохранение в БД (с подменой Id, описанной выше):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
try {
    googlePlayGamesRepository.save(googlePlayGame);
}
catch (org.springframework.dao.DuplicateKeyException e) {
       GooglePlayGame game = googlePlayGamesRepository.findByTitleIgnoreCase(googlePlayGame.getTitle());
       googlePlayGame.setId(game.getId());
       googlePlayGamesRepository.save(googlePlayGame);
}


Знаю, что некрасиво (мне самому не нравится), но пока так.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974912
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Там почти нет кода. Используется готовый метод save() из MongoRepository. Я просто получаю объект из парсера и делаю на нём .save().
Я не писал реализацию для репозитория (интерфейса), используется дефолтная, так как думал, что для моих нужд этого будет достаточно, но возможно всё-таки придется, опыта набираться нужно.
MongoDB, как и другие СУБД, позволяет выполнить обновление не только по ключу, но и по условию.
В том числе и изменить документ с таким-то title . Причём как весь объект, так и только часть полей.

Все операции описаны в документации (например update ) и доступны через драйвер.

MongoRepository - это обёртка над драйвером MongoDB.

Предположу, что метод .save() работает исключительно по ключу (_id).
И когда последний есть, то выполняется update , а когда нет, как при получении объекта из парсера, то insert .
Отсюда вы и получаете DuplicateKey exception , потому как пытаетесь вставить новый документ, нарушающий уникальность индекса по полю title .

Вам нужно выполнить update не по ключу, а по условию title равно что-то там.
Посмотрите, если соответсвующий метод в вашем MongoRepository, возможно есть перегрузка метода .save(), принимающая не только документ, или аннотация какая.

Если же нет, то придётся написать свою реализацию репозитория, или использовать драйвер напрямую.

Вообщем читайте документацию как по MongoDB, так и по тем библиотекам, что используете для работы с ней.

miroooha
Id у меня сейчас типа ObjectId, который относится к BSON типу, если я не ошибаюсь.
Да, как и множество других типов: https://docs.mongodb.com/manual/reference/bson-types/
Среди которых и String , что также можно использовать в качестве значения _id .

miroooha
Проблема в обновлении в том, что там может быть такой сценарий, при котором надо обновлять не одно поле, а 10. Проще новый объект на место старого вставить?
Через $set можно одно, и два, и 10 полей обновить.
И при этом действительно проще новый объект на место старого вставить.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974917
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Сохранение в БД (с подменой Id, описанной выше):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
try {
    googlePlayGamesRepository.save(googlePlayGame);
}
catch (org.springframework.dao.DuplicateKeyException e) {
       GooglePlayGame game = googlePlayGamesRepository.findByTitleIgnoreCase(googlePlayGame.getTitle());
       googlePlayGame.setId(game.getId());
       googlePlayGamesRepository.save(googlePlayGame);
}



Знаю, что некрасиво (мне самому не нравится), но пока так.

Да уж, вот вам ссылки на документацию по драйверу для 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
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974972
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДовольно спорное заявление, но я отказался от Postgres из-за того, что при деплоее на heroku там проблемы с подключением были. Мне также говорили, зачем я пишу бота на Java, когда есть Python?
Там на хероку всё автоматом подключается в Postgresql.

А спорить не надо. Я знаю о чём говорю и это подтверждено опытом. Mongodb приводит к очень плачевным результатам.
Хотя не так. Нежелание учиться и лень приводят к очень плачевным результатам.

Python говно хуже явы.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974976
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
Mongodb приводит к очень плачевным результатам.

Интересно к каким?

6 лет как у нас MongoDB вполне успешно используется в продакшене.
Да, надо знать как оно устроено и как с ним работать.

А если что-то не уметь готовить, тогда да, результаты будут плачевные, в том числе и с Postgres.

Который мы кстати тоже вполне успешно используем в продакшене :)
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974979
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух , спасибо за разъяснения!
Покопаюсь в документации.

Пока посмотрел метод save MongoRepository. С дефолтной реализацией он работает так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public <S extends T> S save(S entity) {

     Assert.notNull(entity, "Entity must not be null!");

     if (entityInformation.isNew(entity)) {
          return mongoOperations.insert(entity, entityInformation.getCollectionName());
     }

     return mongoOperations.save(entity, entityInformation.getCollectionName());
}


Вызывается или insert, если такой entity нет, либо save класса MongoTemplate.
Ну а там уже реализация посложнее, сходу не разобрался. Единственное, в этом методе save активно мелькает id.
Код: java
1.
Object id = saveDocument(collectionName, dbDoc, objectToSave.getClass());


А в saveDocument такое дело:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if (!mapped.hasId()) {
	if (writeConcernToUse == null) {
		collection.insertOne(dbDoc);
	} else {
		collection.withWriteConcern(writeConcernToUse).insertOne(dbDoc);
	}
} else if (writeConcernToUse == null) {
	collection.replaceOne(mapped.getIdFilter(), dbDoc, new ReplaceOptions().upsert(true));
} else {
	collection.withWriteConcern(writeConcernToUse).replaceOne(mapped.getIdFilter(), dbDoc,
			new ReplaceOptions().upsert(true));
}
return mapped.getId();


Дальше лезть ёщё страшнее.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974983
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
dakeiras
Mongodb приводит к очень плачевным результатам.

Интересно к каким?

6 лет как у нас MongoDB вполне успешно используется в продакшене.
Да, надо знать как оно устроено и как с ним работать.

А если что-то не уметь готовить, тогда да, результаты будут плачевные, в том числе и с Postgres.

Который мы кстати тоже вполне успешно используем в продакшене :)

я получил систему завязанную на монго, где он был не к месту. А как и в 90% случаев к месту была бы SQL база.
Пришлось к ней писать доп. систему с человеческой SQL базой.

Это спасло от многомилионных убытков. (Но не надолго как показала практика).
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974984
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДа, надо знать как оно устроено и как с ним работать.
кстати, как в этом монго сделать так чтобы большой объект файл с записями 100мб можно было сохранять?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974988
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Дмитрий Мух , спасибо за разъяснения!
Покопаюсь в документации.

Пока посмотрел метод save MongoRepository. С дефолтной реализацией он работает так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public <S extends T> S save(S entity) {

     Assert.notNull(entity, "Entity must not be null!");

     if (entityInformation.isNew(entity)) {
          return mongoOperations.insert(entity, entityInformation.getCollectionName());
     }

     return mongoOperations.save(entity, entityInformation.getCollectionName());
}



Вызывается или insert, если такой entity нет, либо save класса MongoTemplate.
Ну а там уже реализация посложнее, сходу не разобрался. Единственное, в этом методе save активно мелькает id.
Код: java
1.
Object id = saveDocument(collectionName, dbDoc, objectToSave.getClass());



А в saveDocument такое дело:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if (!mapped.hasId()) {
	if (writeConcernToUse == null) {
		collection.insertOne(dbDoc);
	} else {
		collection.withWriteConcern(writeConcernToUse).insertOne(dbDoc);
	}
} else if (writeConcernToUse == null) {
	collection.replaceOne(mapped.getIdFilter(), dbDoc, new ReplaceOptions().upsert(true));
} else {
	collection.withWriteConcern(writeConcernToUse).replaceOne(mapped.getIdFilter(), dbDoc,
			new ReplaceOptions().upsert(true));
}
return mapped.getId();



Дальше лезть ёщё страшнее.

Ну видно же, что если isNew(entity), то insert. Если нет id, то тоже insert. Что и требовалось доказать

Отсюда и DuplicateKey exception по title.

Вам по идее вместо mapped.getIdFilter() нужен некий mapped.getTitleFilter(), тогда выполнив:
Код: java
1.
collection.replaceOne(mapped.getTitleFilter(), dbDoc, new ReplaceOptions().upsert(true));


вы получите то, что вам нужно: нет документа с таким title, он добавится; есть - обновится.

На writeConcern не обращайте внимание, оно вам не надо.
Разве что можете в документации почитать, что это такое и когда следует использовать: https://docs.mongodb.com/manual/reference/write-concern/
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974989
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
авторДа, надо знать как оно устроено и как с ним работать.

кстати, как в этом монго сделать так чтобы большой объект файл с записями 100мб можно было сохранять?
Как как... GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974991
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
Дмитрий Мух
пропущено...

Интересно к каким?

6 лет как у нас MongoDB вполне успешно используется в продакшене.
Да, надо знать как оно устроено и как с ним работать.

А если что-то не уметь готовить, тогда да, результаты будут плачевные, в том числе и с Postgres.

Который мы кстати тоже вполне успешно используем в продакшене :)

я получил систему завязанную на монго, где он был не к месту. А как и в 90% случаев к месту была бы SQL база.
Пришлось к ней писать доп. систему с человеческой SQL базой.

Это спасло от многомилионных убытков. (Но не надолго как показала практика).

То есть вам досталась система на MongoDB, вы перенесли её на SQL базу... И в итоге получили убытки?

Простите, но мне видится, что проблема тут не в MongoDB.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974994
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
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% случаев работы например в банковоской сфере.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39974997
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
Дмитрий Мух
пропущено...

Как как... GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.

я это видел. Как существующую базу\приложение на это мигрировать?

Тут я вам сходу не скажу, я же не видел вашу базу\приложение.

Вопрос из разряда: как мигрировать приложение, что хранит файлы на сетевой шаре в Amazon S3.
Зависит от того, как это самое приложение спроектировано и реализовано.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975002
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется что количество "миграторов" в нашем мире
пропорционально количеству систем в квадрате.

А квадрат - это нехорошее число. Растет слишком резко. Не угонимся за всеми.

Тогда вместо того чтобы гуглить или ждать специфичный мигратор,
можно взять ... и написать свой.

Я не думаю что это сложно. На мой взгляд - курсовая для 2 курса
факультета ПО.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975004
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я не думаю что это сложно. На мой взгляд - курсовая для 2 курса
факультета ПО.

Мне вот тоже кажется, что это не сложно, если приложение хорошо спроектировано.
Если же там некий SmartUI монолит, это уже вопрос
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975007
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
авторТо есть вам досталась система на MongoDB, вы перенесли её на SQL базу... И в итоге получили убытки?

Простите, но мне видится, что проблема тут не в MongoDB.

Не перенесли а дуплицировали данные, OLAP.

Но проблема и правда не в монго, как я выше и написал. Проблема в том что не нужно было его использовать изначально.
Это объектная БД, она не приспособлена для 90% случаев работы например в банковоской сфере.
За банковскую сферу не скажу, потому как в ней не работал, хоть и были предложения.

И при этом беглое гугление говорит, что такие крупные финансовые конгломераты, как Citigroup Inc., вполне успешно используют MongoDB в автоматизации определённых процессов.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975016
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторCitigroup
Они и Кобол используют до сих пор. Это не говорит ни о чём.

Насчёт миграции - вот и ответ на ваш вопрос касательно "печальных результатов".
Лишние трудозатраты, потеря времени, как следствие убытки приумножаемые фактором срочности.

А всё потому что неправильные решения были приняты изначально.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975020
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
авторCitigroup

Они и Кобол используют до сих пор. Это не говорит ни о чём.

Насчёт миграции - вот и ответ на ваш вопрос касательно "печальных результатов".
Лишние трудозатраты, потеря времени, как следствие убытки приумножаемые фактором срочности.

А всё потому что неправильные решения были приняты изначально.
Хорошо, тут мне нечего обсуждать, так как нет подробностей, да и нет никакого желания.

Вот только из этого не следует, что ТСу не подходит MongoDB.

Его задача:
miroooha
У меня есть два вида поиска игры - по названию (если игра есть в БД) и по ссылке. Парсер работает по ссылке. Ты ему ссылку, а он тебе готовый объект с информацией об игре. После каждого запроса по ссылке объект сохраняется в БД, чтобы в дальнейшем игру можно было искать по названию. При использовании парсера я не беру информацию из БД, я её туда только кладу. А при поиске по названию из БД только беру.
отлично ложится на MongoDB.

И очевидно, что вы слишком субъективны в этом вопросе.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975021
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
dakeiras
пропущено...

Они и Кобол используют до сих пор. Это не говорит ни о чём.

Насчёт миграции - вот и ответ на ваш вопрос касательно "печальных результатов".
Лишние трудозатраты, потеря времени, как следствие убытки приумножаемые фактором срочности.

А всё потому что неправильные решения были приняты изначально.

Хорошо, тут мне нечего обсуждать, так как нет подробностей, да и нет никакого желания.

Вот только из этого не следует, что ТСу не подходит MongoDB.

Его задача:
miroooha
У меня есть два вида поиска игры - по названию (если игра есть в БД) и по ссылке. Парсер работает по ссылке. Ты ему ссылку, а он тебе готовый объект с информацией об игре. После каждого запроса по ссылке объект сохраняется в БД, чтобы в дальнейшем игру можно было искать по названию. При использовании парсера я не беру информацию из БД, я её туда только кладу. А при поиске по названию из БД только беру.
отлично ложится на MongoDB.

И очевидно, что вы слишком субъективны в этом вопросе.

Он отказался от Postgresql потому что неправльно сделал что-то (хотя по умолчанию даже Постгрес работает в Хероку) и вместо того чтобы разобраться, полез в Mongodb.

А потом будет ходить по миру и распевать что SQL бд плохие для старпёров, а вот Mongodb для крутых молодых продвинутых эффективных.

Норм?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975024
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
Дмитрий Мух
пропущено...

Хорошо, тут мне нечего обсуждать, так как нет подробностей, да и нет никакого желания.

Вот только из этого не следует, что ТСу не подходит MongoDB.

Его задача:
пропущено...
отлично ложится на MongoDB.

И очевидно, что вы слишком субъективны в этом вопросе.

Он отказался от Postgresql потому что неправльно сделал что-то (хотя по умолчанию даже Постгрес работает в Хероку) и вместо того чтобы разобраться, полез в Mongodb.

А потом будет ходить по миру и распевать что SQL бд плохие для старпёров, а вот Mongodb для крутых молодых продвинутых эффективных.

Норм?

У вас явно слишком предвзятое отношение к MongoDB.

Да пусть себе ходит.
Это будет дюже забавно: написал простейший парсер для Google Play и теперь ходит по миру и распевает, что SQL БД плохие
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975026
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,

я вот тут подумал о том, что вы же действительно можете использовать в качестве _id не ObjectId, а строку
при чём ведь она уже есть в самой ссылке на Google Play: https://play.google.com/store/apps/details?id=com.n3twork.tetris

Вот же: com.n3twork.tetris .

Используйте этот id в своём парсере и тогда всё у вас заработает с MongoRepository.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975030
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делов-то:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "googleplaygames")
@Builder(builderClassName = "GooglePlayGameBuilder", toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@Getter
@FieldDefaults(level = AccessLevel.PRIVATE)
public final class GooglePlayGame implements Serializable {
    @Id
    String id;
    @Indexed(unique = true)
    String title;
    String currentVersion
...
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975329
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dakeiras

Он отказался от Postgresql потому что неправльно сделал что-то (хотя по умолчанию даже Постгрес работает в Хероку) и вместо того чтобы разобраться, полез в Mongodb.

А потом будет ходить по миру и распевать что SQL бд плохие для старпёров, а вот Mongodb для крутых молодых продвинутых эффективных.

Норм?

Как-то вы рассуждаете и за себя и за того парня. Да, в немалой степени я отказался от Postgres из-за того, что мне не удалось решить проблему подключений (в heroku их максимум 20). Пробовал Hikari Pool - стало лучше, но проблема глобально осталась.

Но изначально я хотел хранить объект в JSON-формате (или ему подобном), так как в моей первой версии приложении, результат парсера размещался как раз в JSON-файл. Но так как Dynos система heroku не поддерживает/не хранит файлы в принципе, моя библиотека обновлялась каждые 24ч при рестарте приложения. Поэтому я подумал о БД.

Mongo прекрасно, на мой взгляд, подходит для моих задач: облачный склад для моих документов (объектов с игрой).

Каждой БД найдется своё применение. А если вы я выбрал не Postgres а Oracle?

Я выбрал то, что мне подошло.

Ну столкнулся я и в Монго с трудностями, наверное, надо было попробовать Redis? Нет, я решил копать в Монго дальше, и что в этом плохого?

Во втором своем проекте я, скорее всего, буду использовать Postgres. Я уже учусь, развиваюсь. Не всё сразу.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975339
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух
miroooha,

я вот тут подумал о том, что вы же действительно можете использовать в качестве _id не ObjectId, а строку
при чём ведь она уже есть в самой ссылке на Google Play: https://play.google.com/store/apps/details?id=com.n3twork.tetris

Вот же: com.n3twork.tetris .

Используйте этот id в своём парсере и тогда всё у вас заработает с MongoRepository.

Имя пакета приложения? Но говорят, что строку в качестве primary key (ведь id по сути и есть primary key) не стоит использовать?

Я попробовал и всё работает! :)

Как можно по-другому достать значение параметра id из URL?
Код: java
1.
2.
3.
4.
5.
6.
7.
private String getAppId(String URL) throws URISyntaxException {
    URI uri = new URI(URL);
    Map<String, String> params = Arrays.stream(uri.getQuery().split("&"))
            .map(s -> s.split("="))
            .collect(Collectors.toMap(k -> k[0], v -> v.length > 1 ? v[1] : ""));
    return params.get("id");
}


Просто с помощью классов URI/URL не получилось. Может есть готовые решения в сторонних библиотеках?

Ссылка может быть как такой:
https://play.google.com/store/apps/details?id=com.playdigious.deadcells.mobile&hl=en
Так и:
https://play.google.com/store/apps/details?id=com.playdigious.deadcells.mobile
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975360
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
dakeiras

Он отказался от Postgresql потому что неправльно сделал что-то (хотя по умолчанию даже Постгрес работает в Хероку) и вместо того чтобы разобраться, полез в Mongodb.

А потом будет ходить по миру и распевать что SQL бд плохие для старпёров, а вот Mongodb для крутых молодых продвинутых эффективных.

Норм?

Как-то вы рассуждаете и за себя и за того парня. Да, в немалой степени я отказался от Postgres из-за того, что мне не удалось решить проблему подключений (в heroku их максимум 20). Пробовал Hikari Pool - стало лучше, но проблема глобально осталась.

Мне кажется что ты до конца недоисследовал проблему. 20 физческих сеансов к БД - даже для нагруженных продуктовых
систем - это нормально. Надо только вовремя возвращать соединения в пул обратно и для 99% кейсов тебе их хватит с
головой. Исключение - это длинные транзакции и ETL. Но ETL у тебя нет ведь у тебя Монго. И длинных транзакций
у тебя тоже скорее всего нет. В монге обычно все корректировки документов - микро-атомарные транзакции.
Тоесть сведя задачу к Монге ты доказал что у тебя оно прекрасно и работало бы в Postgres просто ты где-то
не додавил проблему до конца. А надо было просто понаблюдать что эти 20 сеансов в пуле у тебя делают.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975364
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Дмитрий Мух
miroooha,

я вот тут подумал о том, что вы же действительно можете использовать в качестве _id не ObjectId, а строку
при чём ведь она уже есть в самой ссылке на Google Play: https://play.google.com/store/apps/details?id=com.n3twork.tetris

Вот же: com.n3twork.tetris .

Используйте этот id в своём парсере и тогда всё у вас заработает с MongoRepository.

Имя пакета приложения?
Имя? Параметр id - это имя? Не идентификатор? Серъёзно?

miroooha
Но говорят, что строку в качестве primary key (ведь id по сути и есть primary key) не стоит использовать?
А я говорю, что стоит. И могу ещё раз процитировать документацию.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975382
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Я попробовал и всё работает! :)

Кросавчег!
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975384
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha

Просто с помощью классов URI/URL не получилось. Может есть готовые решения в сторонних библиотеках?

Ссылка может быть как такой:
https://play.google.com/store/apps/details?id=com.playdigious.deadcells.mobile&hl=en
Так и:
https://play.google.com/store/apps/details?id=com.playdigious.deadcells.mobile

Ну тебе надо в строке найти "id=" и потом цепочку символов до следующего "&".
Это же просто банально. Да может быть есть сторонние библиотеки. Но разве
тривиальное решение для тебя - неприемлемо?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975386
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух
miroooha
пропущено...

Имя пакета приложения?
Имя? Параметр id - это имя? Не идентификатор? Серъёзно?

miroooha
Но говорят, что строку в качестве primary key (ведь id по сути и есть primary key) не стоит использовать?
А я говорю, что стоит. И могу ещё раз процитировать документацию.

Да, этот параметр по сути является именем пакета приложения, и по идее он всегда уникален. Если разобрать .apk файл с игрой, его можно будет там найти. Знаю, так как ковырял .apk файлы по молодости.

Цитату в студию! :)
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975391
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Дмитрий Мух
пропущено...
Имя? Параметр id - это имя? Не идентификатор? Серъёзно?

пропущено...
А я говорю, что стоит. И могу ещё раз процитировать документацию.

Да, этот параметр по сути является именем пакета приложения, и по идее он всегда уникален. Если разобрать .apk файл с игрой, его можно будет там найти. Знаю, так как ковырял .apk файлы по молодости.

Оу, ну не надо про .apk, мобильные приложения я писал, знаю что это такое :)

Хорошо, давайте так.

Имя пакета приложения на сайте Google Play является идентификатором этого самого приложения.
Поэтому вы спокойно можете его использовать у себя в базе как _id документа.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975392
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
miroooha
пропущено...

Как-то вы рассуждаете и за себя и за того парня. Да, в немалой степени я отказался от Postgres из-за того, что мне не удалось решить проблему подключений (в heroku их максимум 20). Пробовал Hikari Pool - стало лучше, но проблема глобально осталась.

Мне кажется что ты до конца недоисследовал проблему. 20 физческих сеансов к БД - даже для нагруженных продуктовых
систем - это нормально. Надо только вовремя возвращать соединения в пул обратно и для 99% кейсов тебе их хватит с
головой. Исключение - это длинные транзакции и ETL. Но ETL у тебя нет ведь у тебя Монго. И длинных транзакций
у тебя тоже скорее всего нет. В монге обычно все корректировки документов - микро-атомарные транзакции.
Тоесть сведя задачу к Монге ты доказал что у тебя оно прекрасно и работало бы в Postgres просто ты где-то
не додавил проблему до конца. А надо было просто понаблюдать что эти 20 сеансов в пуле у тебя делают.

Не отрицаю, что не до конца разобрался. Но нашел альтернативную рабочую версию, стоит ли мешки ворочать?
Я обязательно попробую решить эту проблему и разобраться, но уже на другом проекте (или на этом же, но на другой ветке). Записал себе в блокнотик.
mayton
miroooha

Просто с помощью классов URI/URL не получилось. Может есть готовые решения в сторонних библиотеках?

Ссылка может быть как такой:
https://play.google.com/store/apps/details?id=com.playdigious.deadcells.mobile&hl=en
Так и:
https://play.google.com/store/apps/details?id=com.playdigious.deadcells.mobile

Ну тебе надо в строке найти "id=" и потом цепочку символов до следующего "&".
Это же просто банально. Да может быть есть сторонние библиотеки. Но разве
тривиальное решение для тебя - неприемлемо?

Я бы даже сказал слишком банально. Но меня всегда интересовали другие возможные решения. Я изначально пишу то, что приходит в голову, а потом улучшаю, если это необходимо и возможно.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975394
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Цитату в студию! :)

The _id field may contain values of any BSON data type , other than an array.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975396
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha

Я бы даже сказал слишком банально. Но меня всегда интересовали другие возможные решения. Я изначально пишу то, что приходит в голову, а потом улучшаю, если это необходимо и возможно.

Ну тот солюшен на Stream-ах работает?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975409
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух

Имя пакета приложения на сайте Google Play является идентификатором этого самого приложения.

Утвердительно киваю головой. :)
mayton
miroooha

Я бы даже сказал слишком банально. Но меня всегда интересовали другие возможные решения. Я изначально пишу то, что приходит в голову, а потом улучшаю, если это необходимо и возможно.

Ну тот солюшен на Stream-ах работает?

Работает вери велл, наверное. По крайней мере, работает на том, что успел протестировать.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975418
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПробовал Hikari Pool - стало лучше, но проблема глобально осталасьв Спринге и так Hikari используется по умолчанию. И он настроен по умолчанию на 5-10 коннектов если мне память не изменяет. Так что нормально он пашет с Хероку.
Скорее всего у тебя 2 приложения к 1 базе подключались.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975422
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Работает вери велл, наверное. По крайней мере, работает на том, что успел протестировать.

Ну и прекрасно. Пусть работает. Нагрузка на него - слабая. Сколько раз в секунду ты его дёрнешь?
Вряд-ли слишком много. Тебе надо больше качать и вставлять в свою монгу.

Это знаешь как старый двигатель в Москвич 2141. Пока он работает - пускай он грязный весь
в подтеках масла и закопченый. А как только ты решил его "перебрать" и промысть дескыть чтоб
лучше было - тут двигателю и капец. Надо будет заново ремонтировать.

Вобщем старый админски-девопский прицип. Да? Работает - и ладньенько.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975468
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
miroooha
Работает вери велл, наверное. По крайней мере, работает на том, что успел протестировать.

Ну и прекрасно. Пусть работает. Нагрузка на него - слабая. Сколько раз в секунду ты его дёрнешь?
Вряд-ли слишком много. Тебе надо больше качать и вставлять в свою монгу.

Это знаешь как старый двигатель в Москвич 2141. Пока он работает - пускай он грязный весь
в подтеках масла и закопченый. А как только ты решил его "перебрать" и промысть дескыть чтоб
лучше было - тут двигателю и капец. Надо будет заново ремонтировать.

Вобщем старый админски-девопский прицип. Да? Работает - и ладньенько.

У меня тут как раз в деревне под окном Москвич 2140 1984 года стоит. Хоть сейчас заводи и езжай. :D Правда на большие расстояние рискованно, в любой момент может пернуть и загнуться.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975710
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут такое дело: давно думал, есть ли решение описанному ниже вопросу.

Google Play определяет страну, из которой подключается пользователь по IP-адресу (вроде как). При запуске с локальной машины парсер парсит информацию о стоимости игры в рублях - всё ок. При старте с heroku парсер уже подключается с европейского адреса, и вся страница отображается в соответствующей локали и с соответствующими ценами (евро).
Перевести содержимое страницы на русский смог с помощью простого костыля (суфикс &hl=ru к основному адресу), но на цену данный суффикс не влияет. Она конкретно привязана к соединению.

Можно ли как-то обмануть Google помимо использования прокси/VPN (работают через раз с Jsoup)?
Может в heroku есть какие-нибудь настройки?

Иль забить и смириться?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975725
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Тут такое дело: давно думал, есть ли решение описанному ниже вопросу.

Google Play определяет страну, из которой подключается пользователь по IP-адресу (вроде как). При запуске с локальной машины парсер парсит информацию о стоимости игры в рублях - всё ок. При старте с heroku парсер уже подключается с европейского адреса, и вся страница отображается в соответствующей локали и с соответствующими ценами (евро).
Перевести содержимое страницы на русский смог с помощью простого костыля (суфикс &hl=ru к основному адресу), но на цену данный суффикс не влияет. Она конкретно привязана к соединению.

Можно ли как-то обмануть Google помимо использования прокси/VPN (работают через раз с Jsoup)?
Может в heroku есть какие-нибудь настройки?

Иль забить и смириться?

А проблема в чём?
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975768
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,

Нужен юз кейс.
Например:
- юзверь германии встал с кровати
- нажал урл ffffffffff
- мой сервер ответил ыыыыыыы
...
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975787
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,

Можешь подключаться через прокси сервера той страны, диапазон ip которых тебе выгоден с точки зрения логики Гугла.

Но прокси медлительны и ненадёжны. Требуют надзора и обновления настроек.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975866
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух

А проблема в чём?

Дык я бота же сделал, который конечно скорее всего никого не заинтересует (изначально делал его по дружескому заказу для группы, но он уже не нужен, насколько я понял), и условно нацелен он был на русскоговорящую аудиторию. Хотя его функционал в определенных случаях может быть удобен (для тех, кто не пользуется Google Play и не покупает там игры).
Решил доделать и оставить себе в качестве проекта для будущего резюме. В итоге всё взаимодействие и информация на кириллице, а цена выходит в евро. Гуд? Не гуд. Терпимо? Пожалуй.

mayton
miroooha,

Можешь подключаться через прокси сервера той страны, диапазон ip которых тебе выгоден с точки зрения логики Гугла.

Но прокси медлительны и ненадёжны. Требуют надзора и обновления настроек.

Да, в их медлительности и ненадежности я уже убедился. Это первое, что я попробовал и вышло не ахти.

Либо забить болт и переписать всё под англоговорящую аудиторию и оставить евро/доллары. Не знаю.
...
Рейтинг: 0 / 0
Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
    #39975868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
Дмитрий Мух

А проблема в чём?

Дык я бота же сделал, который конечно скорее всего никого не заинтересует (изначально делал его по дружескому заказу для группы, но он уже не нужен, насколько я понял), и условно нацелен он был на русскоговорящую аудиторию. Хотя его функционал в определенных случаях может быть удобен (для тех, кто не пользуется Google Play и не покупает там игры).
Решил доделать и оставить себе в качестве проекта для будущего резюме. В итоге всё взаимодействие и информация на кириллице, а цена выходит в евро. Гуд? Не гуд. Терпимо? Пожалуй.

mayton
miroooha,

Можешь подключаться через прокси сервера той страны, диапазон ip которых тебе выгоден с точки зрения логики Гугла.

Но прокси медлительны и ненадёжны. Требуют надзора и обновления настроек.

Да, в их медлительности и ненадежности я уже убедился. Это первое, что я попробовал и вышло не ахти.

Либо забить болт и переписать всё под англоговорящую аудиторию и оставить евро/доллары. Не знаю.

Читай документацию на тот Google API который ты используешь. Там должно быть описание региональных
особенностей.
...
Рейтинг: 0 / 0
78 сообщений из 78, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]