@MongoDBRussian

Страница 278 из 342
Bro
30.07.2018
22:33:36
вместо $inc

Irina
30.07.2018
22:34:55
{ _id: 'nenravitsa', count: 1 }, такой список

Bro
30.07.2018
22:35:19
во

значит

Google
Bro
30.07.2018
22:35:31
{$match:{'battles.date': { $gte: sundayBattle}}},

где-то тут косяк

возможно дата не в том формате

Irina
30.07.2018
22:35:54
в других запросах с датами работает все

Bro
30.07.2018
22:40:16
Warrior.aggregate([ {$match:{battles: {$elemMatch: {date: {$gte: sundayBattle}}}}}, ])

ну проверь юзая $elemMatch будет ли выводить что-то

Irina
30.07.2018
22:42:23
пустой массив -_-

Bro
30.07.2018
22:42:43
значит у тебя нет элементов удовлетворяющих условию

поменяй дату

может

Irina
30.07.2018
22:43:17
ну через обычный поиск находило)

просто что только по одному, а не все

Евгений
31.07.2018
04:36:11
Приветы. Народ, совет нужен. Есть документы с вложенными элементами. И их обновляют конкурентные потоки. В итоге получается так, что иногда изменения не фиксируются (переписываются другим потоком). Как лучше обойти проблему?

Google
Rustam
31.07.2018
06:03:39
1. Пересмотреть архитектуру. 2. Дождаться acid транзакций в четвертой монге 3. Реализовать двухфазный коммит

А. Четвертая версия, похоже, уже stable, судя по пину. Отстал от жизни.

Rustam
31.07.2018
07:14:03
А чем ацид транзакции помогут?
Concurrency control это фундамент acid. Две транзакции не изменят данные одновременно. Вы бы проблему детальнее описали, тогда бы стало понятнее. Еще в монге есть атомарные операции (например, inc)

Почитайте про optimistic и pessimistic concurrency control

Евгений
31.07.2018
10:21:32
Bro
31.07.2018
11:07:23
> db.check_unwind.insert({_id: 1, a: [1, 2, 3]}) WriteResult({ "nInserted" : 1 }) > db.check_unwind.findOne() { "_id" : 1, "a" : [ 1, 2, 3 ] } > db.check_unwind.aggregate([{$unwind: '$a'}]) { "_id" : 1, "a" : 1 } { "_id" : 1, "a" : 2 } { "_id" : 1, "a" : 3 }

Евгений
31.07.2018
11:13:17
если такое нужно, использовать специализированную БД которая не имеет с этим проблем
Да игрушку делаем. Простой старт с монгоДБ, но вот вылазит всякое такое.

Bro
31.07.2018
11:14:09
ничто же не мешает несколько БД юзать

Евгений
31.07.2018
11:15:55
Несколько бд, несколько языков...:-)

Bro
31.07.2018
11:16:09
ну таковы реалии

я редис использовал для таких дел

Bro
31.07.2018
13:47:38
может и $out можно сделать

нужно проверять

Google
yopp
31.07.2018
13:58:58
Идеальное решение: изменить архитектуру таким образом, чтоб конфликты не возникали.

Bro
31.07.2018
14:02:23
ну вот сейчас как раз так сделал

просто не всегда получается

уйти от необходимости конкурентно менять записи. даже при смене архитектуры.

ну и как не проблема ДБ. технологии это всегда путь компромисов. монго просто не предназначена (пока) для того чтобы делать транзакции как в посгресе

кстати там есть атомарные операции

я монгу всегда почти юзаю но без фанатизма, во многих случаях реляционки лучше справляются

yopp
31.07.2018
14:05:40
Проблема конфликтов по-умолчанию не имеет решения.

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

Bro
31.07.2018
14:09:18
https://docs.mongodb.com/manual/tutorial/model-data-for-atomic-operations/

я хз правда какие у него конфликты. у меня как правило когда несколько процесов получают данные и лезут апдейтить документs

yopp
31.07.2018
14:11:51
Два пользователя одновременно полностью изменили значение одного поля. Например флаг с правом доступа. Как решить эту проблему с помощью атомарных операций?

Bro
31.07.2018
14:13:01
там есть всякие стратегии типа optimistic updates

yopp
31.07.2018
14:13:20
Ну вот, ответ на вопрос — никак.

Потому что это конфликтующие изменения

И это проблема разработчика, а точнее архитектора решения, а не БД, какую из стратегий разрешения конфликта выбрать.

Блокировка один из способов разрешения. Монга по-умолчанию просто последовательно применяет операции и конфликт разрешается недетерминированно

В ряде случаев это допустимо, в ряде нет. Но выбор допустимости это не забота БД. И реляционные субд точно так же решают эту проблему

Разница в том, что реляционные бд почти всегда поддерживают транзакционность и имеют встроенные механизмы. В монге до 4.0 таких механизмов не предлагалось

Можно было реализовать свой, но 2 phase commit это безумно сложно

Google
Евгений
31.07.2018
14:20:18
Идеальное решение: изменить архитектуру таким образом, чтоб конфликты не возникали.
Это онлайн игра. Есть склад, в нем содержимое. Содержимое может меняться не только по действию игрока, но и по другим причинам (типа производство).

yopp
31.07.2018
14:21:11
Самый простой способ: журнал

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

Евгений
31.07.2018
14:22:27
Сейчас все кто хотят записать создают событие. И эти события обрабатываются последовательно.

yopp
31.07.2018
14:22:38
Тоже вариант

Второй вариант, на каждый «потребляемый» элемент склада завести отдельный документ. Тогда можно будет обойтись findAndUpdate с оптимистичной блокировкой

Хотя на мой взгляд для игр журналы являются самым простым способом. Каждое изменение состояния игры — документ

Евгений
31.07.2018
14:25:13
Вынести содержимое склада за документ склада? Такое у нас с другим типом содержимого. Модули штучные, они снаружи. А вот сыпучка - внутри.

yopp
31.07.2018
14:25:38
Например, да.

Bro
31.07.2018
14:26:00
ну так в том то и дело что в реляционнных ну уронве базы данных реализовано, для монги придется делать абстракцию на уровне приложения уже.

yopp
31.07.2018
14:26:50
ну так в том то и дело что в реляционнных ну уронве базы данных реализовано, для монги придется делать абстракцию на уровне приложения уже.
Мы говорили о том, чьей проблемой это является. Выбор механизма разрешения конфликтов — проблема разработчика. Монга даёт один инструменты, реляционные базы дают другие инструменты.

Евгений
31.07.2018
14:27:56
Спасибо всем откликнувшимся. В общем то, что сделал - не самый плохой вариант.

yopp
31.07.2018
14:27:59
Транзакции не панацея. Транзакционность это ОЧЕНЬ ресурсоёмко. Её в монгу добавили исключительно для удобства, в тех случаях когда транзакционность жизненно необходима

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

Вангую разгромные статьи что монга говно

Спасибо всем откликнувшимся. В общем то, что сделал - не самый плохой вариант.
Главное убедиться что нет других клиентов, которые могут мимо очереди писать

Лучше всего настроив права и дав доступ на запись только конкретной учетной записи, с которой будет аутентифицироваться обработчик очередей

Bro
31.07.2018
14:42:03
Ооо стабильная 4ка вышла

Когда обновляться советуете?

Подождать 4.2 какую нибудь

Google
Serhio
31.07.2018
14:48:50
Когда обновляться советуете?
радует меня Ваш подход =) сосчитайте тут людей которым не пофиг когда Вам обновляться...

Bro
31.07.2018
14:50:49
Gleb
31.07.2018
14:51:16
Serhio
31.07.2018
14:51:28
Bro
31.07.2018
14:52:36
June 27, 2018

разумно наверное будет подождать до следующей минорной версии.

AstraSerg
31.07.2018
16:51:16
Когда обновляться советуете?
Нолик всегда смущает. Лучше подождать, имхо.

Евгений
31.07.2018
16:55:45
Главное убедиться что нет других клиентов, которые могут мимо очереди писать
Ну это подконтрольная штука. Может очередь сообщений сюда прикрутить. Хм....

yopp
31.07.2018
16:57:28
4.0.1 уже на подходе https://docs.mongodb.com/manual/release-notes/4.0-changelog

Bro
31.07.2018
19:36:38
норм. фичи были $lookup и $facet

User ?
31.07.2018
20:20:13
Привет, кто работал с mgo? подскажите есть ли возможность получить objectid созданного документа при Insert?

Страница 278 из 342