Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4      [все]
 Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Подключил к своему проекту MongoDB (Mongo Cloud) и складываю туда объекты в виде документов.

Репозиторий для общения с БД:
@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);

}

Сам объект, который сохраняю:
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:
org.springframework.dao.DuplicateKeyException: E11000 duplicate key error collection: 5ef31a21233f9c398f473c6e_botapi.googleplaygames index: title dup key: { title: null };

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

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

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

Как быть? Писать ручками запрос?
28 июн 20, 15:58    [22158601]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
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
?
29 июн 20, 07:39    [22158777]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
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, не смотря на то, что другие поля уже отличаются.
29 июн 20, 12:31    [22158981]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
В доках написано, что метод save работает как insert, если такого документа нет, и как update, если документ уже есть. Но кто-то меня обманывает, либо что-то недоговаривает. Никакого update у меня не происходит.

Сообщение было отредактировано: 29 июн 20, 12:32
29 июн 20, 12:32    [22158985]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,
Значит ссылку где обманывают сюда. И код тоже сюда.
29 июн 20, 12:58    [22159006]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,
Там в веб в примере id строковый тип?
29 июн 20, 13:02    [22159008]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
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

Сообщение было отредактировано: 29 июн 20, 13:19
29 июн 20, 13:20    [22159016]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,

>В подобных примерах в основном числовой тип, а не строковый. У меня же строка.
Вот и сделай числовой. И потом с примером сюда.
29 июн 20, 14:11    [22159064]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
PetroNotC Sharp
miroooha,

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

А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно.
29 июн 20, 21:02    [22159255]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17915
miroooha
А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно
вообще-то это первое дело в таблицах иметь поде id primary key
29 июн 20, 22:16    [22159280]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17915
miroooha
А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно
вообще-то это первое дело в таблицах иметь поде id primary key
29 июн 20, 22:16    [22159281]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
вадя
miroooha
А нафига мне числовой то? Если у меня поиск по названию игры. На кой черт мне вообще это число? :D Ввести доп.переменную числового типа и пометить её как primary key? Я попробую, но выглядит абсурдно
вообще-то это первое дело в таблицах иметь поде id primary key

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

Ну я буду пробовать, потом отпишусь о результатах.

Сообщение было отредактировано: 29 июн 20, 22:31
29 июн 20, 22:29    [22159289]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 17915
miroooha
Оно обязательно должно быть числом?
если ты хочешь иметь тормоза - то можешь что угодно использовать.
кроме этого поле primary key делают автоинкриментным
30 июн 20, 07:24    [22159394]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,
Долго пробуешь.
Заработает, поставишь строковое. Делов то.
30 июн 20, 07:42    [22159399]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
Обычно title не выбирают на роль уникального ключа. По смыслу - он больше атрибут. Или комментарий.
30 июн 20, 08:33    [22159420]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
вадя
miroooha
Оно обязательно должно быть числом?
если ты хочешь иметь тормоза - то можешь что угодно использовать.
кроме этого поле primary key делают автоинкриментным

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

Попробовал так:
Вручную ввел доп.поле типа ObjectId, которое генерит сама монго, если не видит аннотации @Id. Повесил на неё @Id, а на название повесил индекс на уникальность. Проверил: взял объект из БД, через сеттер изменил одно из полей и попробовал сохранить измененный объект - всё прошло успешно.
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.
30 июн 20, 13:48    [22159654]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,
Второй нерабочий случай не понял.
Транзакция должна быть короткой 0,1сек.
С коммитом.
Поле id менять нельзя.
30 июн 20, 13:52    [22159658]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
PetroNotC Sharp
miroooha,
Второй нерабочий случай не понял.
Транзакция должна быть короткой 0,1сек.
С коммитом.
Поле id менять нельзя.

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

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

P.S. Т.е. если я в будущем захочу обновить игру в БД по одной ссылке и 1 запросу с парсера, если у неё условно сменится номер, или цена, то я получу ошибку.

Сообщение было отредактировано: 30 июн 20, 13:59
30 июн 20, 13:59    [22159665]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Грубо говоря, он не хочет просто взять и "переписать" старый объект на новый, у которого новые значения. Надо взять уже имеющийся объект и БД, изменить ему поля и закинуть его обратно. Не очень удобно для моего сценария.

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

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

Сообщение было отредактировано: 30 июн 20, 14:08
30 июн 20, 14:03    [22159669]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
При каждом запросе залезать в БД и проверять, есть ли там такая игра. Если есть, то достать и сравнить с той, что выдал парсер. Прогнать и сравнить через equals, и в случае несовпадения заменить через сеттер соответствующие поля и обновить объект в БД. Как-то не комильфо.

Сообщение было отредактировано: 30 июн 20, 14:14
30 июн 20, 14:14    [22159682]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
miroooha
При каждом запросе залезать в БД и проверять, есть ли там такая игра. Если есть, то достать и сравнить с той, что выдал парсер. Прогнать и сравнить через equals, и в случае несовпадения заменить через сеттер соответствующие поля и обновить объект в БД. Как-то не комильфо.

Ещё один костыль, который только что испробовал: при попытке сохранить объект в БД ловить этот exception на дубликат. В catch блоке во временную переменную складывать объект из БД с таким же названием. Доставать у него этот уникальный id, и через сеттер ставить тому объекту, который пытаюсь сохранить. В результате объект в БД обновляется. Но как-то мне не очень нравится такой вариант (но хоть работает) :D
30 июн 20, 14:29    [22159697]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8775
Посмотреть, чем "объект из БД" отличается от того, что ты пытаешься пихать, не судьба?
30 июн 20, 14:52    [22159706]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Leonid Kudryavtsev
Посмотреть, чем "объект из БД" отличается от того, что ты пытаешься пихать, не судьба?

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

Просто при работе с Postgres таких проблем не было, он сам всё решал за меня. А здесь вот так вот выходит.

Сообщение было отредактировано: 30 июн 20, 14:57
30 июн 20, 14:57    [22159710]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha
При каждом запросе залезать в БД и проверять, есть ли там такая игра. Если есть, то достать и сравнить с той, что выдал парсер. Прогнать и сравнить через equals, и в случае несовпадения заменить через сеттер соответствующие поля и обновить объект в БД. Как-то не комильфо.

Вы много думаете.
При ОРМ не надо жалеть комп и много думать.
Именно так!
Читаем ПОСЛЕДНЮЮ версию объекта и меняем за 0, 00001 сек.
30 июн 20, 15:39    [22159747]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,
Я не понял что за парсер такой?
Все работы с бд должны быть через одни ворота. Например hibernate.
Если jdbc, то аккуратно и отдельный проект.
Что за парсер?
30 июн 20, 15:42    [22159750]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
PetroNotC Sharp,
Если за 0,0001 сек встретились 3 кода сохранения то этот случай надо читать в доках. В хибере настраивается перетирать старое или вызвать райзе или...
30 июн 20, 15:45    [22159756]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
PetroNotC Sharp
miroooha,
Я не понял что за парсер такой?
Все работы с бд должны быть через одни ворота. Например hibernate.
Если jdbc, то аккуратно и отдельный проект.
Что за парсер?

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

И вот возникает такая ситуация, что игра может быть уже в библиотеке (со старыми данными), и приходит запрос по ссылке (через парсер), и пытается сохранить (обновить) эту новую информацию в БД. Здесь у меня и был конфликт.
Вот и приходится теперь сверять объекты. Точнее я теперь при возникновении этого исключения достаю из БД игру с таким же названием, беру у него этот уникальный id, через сеттер назначаю этот же самый айди объекту с новой информацией и отправляю в БД.
30 июн 20, 16:46    [22159832]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,

ОК. Все верно
30 июн 20, 17:28    [22159861]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
miroooha, а покажи туловище парсера. Что у тебя там? JSoup? HtmlCleaner?
30 июн 20, 17:31    [22159864]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
MongoDB не нужно использовать практически никогда. Это всё от нежелания учить SQL.
30 июн 20, 18:12    [22159896]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
Возможно суммарная стоимость владения Монгой (если покупать ее как сервис у Амазона или Ажура)
будет дешевле чем Postgres. Тогда пожалуй смысл есть.
30 июн 20, 20:17    [22159953]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
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 июн 20, 20:36
30 июн 20, 20:36    [22159960]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha,

что-то у вас много слов и мало кода

никогда не испытывал проблем с upsert в MongoDB

покажите код сохранения

и почитайте документацию, тогда станет понятно, откуда берётся поле _id:
The _id Field
In 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.
30 июн 20, 20:57    [22159967]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

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

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

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

https://docs.mongodb.com/manual/reference/operator/update/set/
30 июн 20, 21:06    [22159969]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Дмитрий Мух
miroooha,

что-то у вас много слов и мало кода

никогда не испытывал проблем с upsert в MongoDB

покажите код сохранения

и почитайте документацию, тогда станет понятно, откуда берётся поле _id:
The _id Field
In 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. Проще новый объект на место старого вставить?
30 июн 20, 21:42    [22159986]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Код есть, но как я уже сказал он предельно прост:
Сам документ:
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
...

Репа:
@Repository
public interface GooglePlayGamesRepository extends MongoRepository <GooglePlayGame, String> {

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

    List<GooglePlayGame> findByTitleContainsIgnoreCase(String gameTitle);

}

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

Знаю, что некрасиво (мне самому не нравится), но пока так.
30 июн 20, 21:49    [22159989]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
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 полей обновить.
И при этом действительно проще новый объект на место старого вставить.
1 июл 20, 14:38    [22160200]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha
Сохранение в БД (с подменой Id, описанной выше):
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
1 июл 20, 14:46    [22160205]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
автор
Довольно спорное заявление, но я отказался от Postgres из-за того, что при деплоее на heroku там проблемы с подключением были. Мне также говорили, зачем я пишу бота на Java, когда есть Python?

Там на хероку всё автоматом подключается в Postgresql.

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

Python говно хуже явы.
1 июл 20, 16:58    [22160270]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
dakeiras
Mongodb приводит к очень плачевным результатам.

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

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

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

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

Сообщение было отредактировано: 1 июл 20, 17:10
1 июл 20, 17:12    [22160276]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Дмитрий Мух, спасибо за разъяснения!
Покопаюсь в документации.

Пока посмотрел метод save MongoRepository. С дефолтной реализацией он работает так:
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.
Object id = saveDocument(collectionName, dbDoc, objectToSave.getClass());

А в saveDocument такое дело:
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();

Дальше лезть ёщё страшнее.
1 июл 20, 17:21    [22160281]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
Дмитрий Мух
dakeiras
Mongodb приводит к очень плачевным результатам.

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

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

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

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

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

Это спасло от многомилионных убытков. (Но не надолго как показала практика).
1 июл 20, 17:28    [22160286]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
автор
Да, надо знать как оно устроено и как с ним работать.

кстати, как в этом монго сделать так чтобы большой объект файл с записями 100мб можно было сохранять?

Сообщение было отредактировано: 1 июл 20, 17:29
1 июл 20, 17:30    [22160288]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha
Дмитрий Мух, спасибо за разъяснения!
Покопаюсь в документации.

Пока посмотрел метод save MongoRepository. С дефолтной реализацией он работает так:
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.
Object id = saveDocument(collectionName, dbDoc, objectToSave.getClass());


А в saveDocument такое дело:
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(), тогда выполнив:
collection.replaceOne(mapped.getTitleFilter(), dbDoc, new ReplaceOptions().upsert(true));

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

На writeConcern не обращайте внимание, оно вам не надо.
Разве что можете в документации почитать, что это такое и когда следует использовать: https://docs.mongodb.com/manual/reference/write-concern/
1 июл 20, 17:33    [22160293]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
dakeiras
автор
Да, надо знать как оно устроено и как с ним работать.

кстати, как в этом монго сделать так чтобы большой объект файл с записями 100мб можно было сохранять?

Как как... GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.
1 июл 20, 17:35    [22160295]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
dakeiras
Дмитрий Мух
пропущено...

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

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

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

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

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

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

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

Простите, но мне видится, что проблема тут не в MongoDB.
1 июл 20, 17:38    [22160297]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
Дмитрий Мух
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% случаев работы например в банковоской сфере.
1 июл 20, 17:44    [22160302]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
dakeiras
Дмитрий Мух
пропущено...

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

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

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

Вопрос из разряда: как мигрировать приложение, что хранит файлы на сетевой шаре в Amazon S3.
Зависит от того, как это самое приложение спроектировано и реализовано.
1 июл 20, 17:50    [22160306]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
Мне кажется что количество "миграторов" в нашем мире
пропорционально количеству систем в квадрате.

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

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

Я не думаю что это сложно. На мой взгляд - курсовая для 2 курса
факультета ПО.
1 июл 20, 17:55    [22160311]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
mayton
Я не думаю что это сложно. На мой взгляд - курсовая для 2 курса
факультета ПО.

Мне вот тоже кажется, что это не сложно, если приложение хорошо спроектировано.
Если же там некий SmartUI монолит, это уже вопрос

Сообщение было отредактировано: 1 июл 20, 17:56
1 июл 20, 17:58    [22160313]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
dakeiras
автор
То есть вам досталась система на MongoDB, вы перенесли её на SQL базу... И в итоге получили убытки?

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

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

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

За банковскую сферу не скажу, потому как в ней не работал, хоть и были предложения.

И при этом беглое гугление говорит, что такие крупные финансовые конгломераты, как Citigroup Inc., вполне успешно используют MongoDB в автоматизации определённых процессов.

Сообщение было отредактировано: 1 июл 20, 18:01
1 июл 20, 18:02    [22160317]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
автор
Citigroup

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

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

А всё потому что неправильные решения были приняты изначально.
1 июл 20, 18:09    [22160327]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
dakeiras
автор
Citigroup

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

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

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

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

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

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

И очевидно, что вы слишком субъективны в этом вопросе.
1 июл 20, 18:15    [22160333]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
Дмитрий Мух
dakeiras
пропущено...

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

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

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

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

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

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

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

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

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

Норм?
1 июл 20, 18:18    [22160335]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
dakeiras
Дмитрий Мух
пропущено...

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

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

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

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

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

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

Норм?

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

Да пусть себе ходит.
Это будет дюже забавно: написал простейший парсер для Google Play и теперь ходит по миру и распевает, что SQL БД плохие
1 июл 20, 18:25    [22160339]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha,

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

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

Используйте этот id в своём парсере и тогда всё у вас заработает с MongoRepository.
1 июл 20, 18:29    [22160343]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
Делов-то:

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
...
1 июл 20, 18:34    [22160347]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
dakeiras

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

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

Норм?

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

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

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

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

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

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

Во втором своем проекте я, скорее всего, буду использовать Postgres. Я уже учусь, развиваюсь. Не всё сразу.
2 июл 20, 12:43    [22160783]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Дмитрий Мух
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?
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
2 июл 20, 12:55    [22160798]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
miroooha
dakeiras

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

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

Норм?

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

Мне кажется что ты до конца недоисследовал проблему. 20 физческих сеансов к БД - даже для нагруженных продуктовых
систем - это нормально. Надо только вовремя возвращать соединения в пул обратно и для 99% кейсов тебе их хватит с
головой. Исключение - это длинные транзакции и ETL. Но ETL у тебя нет ведь у тебя Монго. И длинных транзакций
у тебя тоже скорее всего нет. В монге обычно все корректировки документов - микро-атомарные транзакции.
Тоесть сведя задачу к Монге ты доказал что у тебя оно прекрасно и работало бы в Postgres просто ты где-то
не додавил проблему до конца. А надо было просто понаблюдать что эти 20 сеансов в пуле у тебя делают.
2 июл 20, 13:07    [22160819]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
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) не стоит использовать?
А я говорю, что стоит. И могу ещё раз процитировать документацию.
2 июл 20, 13:10    [22160824]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha
Я попробовал и всё работает! :)

Кросавчег!
2 июл 20, 13:17    [22160843]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
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=" и потом цепочку символов до следующего "&".
Это же просто банально. Да может быть есть сторонние библиотеки. Но разве
тривиальное решение для тебя - неприемлемо?
2 июл 20, 13:22    [22160845]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Дмитрий Мух
miroooha
пропущено...

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

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

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

Цитату в студию! :)
2 июл 20, 13:23    [22160847]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha
Дмитрий Мух
пропущено...
Имя? Параметр id - это имя? Не идентификатор? Серъёзно?

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

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

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

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

Имя пакета приложения на сайте Google Play является идентификатором этого самого приложения.
Поэтому вы спокойно можете его использовать у себя в базе как _id документа.
2 июл 20, 13:29    [22160853]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
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=" и потом цепочку символов до следующего "&".
Это же просто банально. Да может быть есть сторонние библиотеки. Но разве
тривиальное решение для тебя - неприемлемо?

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

Сообщение было отредактировано: 2 июл 20, 13:29
2 июл 20, 13:30    [22160854]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha
Цитату в студию! :)

The _id field may contain values of any BSON data type, other than an array.
2 июл 20, 13:30    [22160856]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
miroooha

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

Ну тот солюшен на Stream-ах работает?
2 июл 20, 13:33    [22160859]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Дмитрий Мух

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

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

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

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

Работает вери велл, наверное. По крайней мере, работает на том, что успел протестировать.
2 июл 20, 13:38    [22160872]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
dakeiras
Member

Откуда:
Сообщений: 549
автор
Пробовал Hikari Pool - стало лучше, но проблема глобально осталась
в Спринге и так Hikari используется по умолчанию. И он настроен по умолчанию на 5-10 коннектов если мне память не изменяет. Так что нормально он пашет с Хероку.
Скорее всего у тебя 2 приложения к 1 базе подключались.
2 июл 20, 13:44    [22160881]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
miroooha
Работает вери велл, наверное. По крайней мере, работает на том, что успел протестировать.

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

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

Вобщем старый админски-девопский прицип. Да? Работает - и ладньенько.
2 июл 20, 13:56    [22160887]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
mayton
miroooha
Работает вери велл, наверное. По крайней мере, работает на том, что успел протестировать.

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

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

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

У меня тут как раз в деревне под окном Москвич 2140 1984 года стоит. Хоть сейчас заводи и езжай. :D Правда на большие расстояние рискованно, в любой момент может пернуть и загнуться.
2 июл 20, 14:38    [22160941]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Тут такое дело: давно думал, есть ли решение описанному ниже вопросу.

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

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

Иль забить и смириться?
2 июл 20, 23:32    [22161298]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
miroooha
Тут такое дело: давно думал, есть ли решение описанному ниже вопросу.

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

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

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

А проблема в чём?
3 июл 20, 00:24    [22161319]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5388
miroooha,

Нужен юз кейс.
Например:
- юзверь германии встал с кровати
- нажал урл ffffffffff
- мой сервер ответил ыыыыыыы
...
3 июл 20, 07:27    [22161371]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
miroooha,

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

Но прокси медлительны и ненадёжны. Требуют надзора и обновления настроек.
3 июл 20, 08:58    [22161407]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
miroooha
Member

Откуда:
Сообщений: 65
Дмитрий Мух

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

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

mayton
miroooha,

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

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

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

Либо забить болт и переписать всё под англоговорящую аудиторию и оставить евро/доллары. Не знаю.
3 июл 20, 12:31    [22161534]     Ответить | Цитировать Сообщить модератору
 Re: Поле объекта в качестве уникального ключа в документе MongoDB (Spring Data)  [new]
mayton
Member

Откуда: loopback
Сообщений: 47981
miroooha
Дмитрий Мух

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

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

mayton
miroooha,

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

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

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

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

Читай документацию на тот Google API который ты используешь. Там должно быть описание региональных
особенностей.
3 июл 20, 12:33    [22161537]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Java Ответить