
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, судя по пину. Отстал от жизни.

Евгений
31.07.2018
07:02:34

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

Евгений
31.07.2018
10:21:32

AstraSerg
31.07.2018
10:39:26

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
ну таковы реалии
я редис использовал для таких дел

AstraSerg
31.07.2018
12:14:53

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

yopp
31.07.2018
13:54:20

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

AstraSerg
31.07.2018
17:01:59

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

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

AstraSerg
31.07.2018
20:29:05