@MongoDBRussian

Страница 87 из 342
yopp
12.05.2017
19:51:19
Добрый день, подскажите пожалуйста, я новичок в mongodb, хочу написать приложение на связки express + mongodb, раньше писал на ruby, python немного на go, использовал postgres либо mysql, можете сказать пожалуйста какие есть ограничения у mongodb, в плане, на сколько она лучше/хуже postgres'а либо mysql, можно ли делать какой-то большой сервис целиком на связки mongo и express ?
Совершенно побарабану на чём начинать. На чём умеешь, на том и делай. Плюс монги в относительно низком пороге вхождения. В остальном база как база. Нужно запомнить что монга НЕ реляционная база данных и научится мыслить документами. Это значит что подходы из реляционной субд в монге будут работать из рук вон плохо. Ну и да, не надо забывать что транзакций нет, есть только гарантия атомарности изменений в одном документе. Это требует тоже отдельного мышления.

Но общее правило: если без транзакций никак — лучше брать не монгу

Потому что транзакции в монге ОЧЕНЬ сложно делаются

Google
Ростислав
12.05.2017
19:56:27
спасибо большое, учту!)

Eugene
12.05.2017
19:58:07
Привет, ребят. Сделал 2 формы авторизации и регистрации. Теперь их как то надо обработать на node (желательно без express) и данные запихнуть в монгу. Подскажите мб туториал какой то по созданию и обработки форм и доку какую то

yopp
12.05.2017
20:46:23
это в канал по ноде

Yaroslav
13.05.2017
12:44:17
этот парень вов сех чатах походу одним и тем же собщением метит)

Cyber
15.05.2017
07:54:00
привет, а кто может подсказать, правильно ли я понимаю что в монго не предполагаются join запросы, а для связей надо собирать айди в документе?

Stefan
15.05.2017
07:56:51
Есть $lookup в агрегациях.

Sergey
15.05.2017
08:07:14
Если при работе с монгой понадобился $lookup, значит что-то пошло не так на этапе выбора СУБД

Cyber
15.05.2017
08:07:59
Если при работе с монгой понадобился $lookup, значит что-то пошло не так на этапе выбора СУБД
на самом деле тривиальная задача - посчитать количество записей пользователя, я просто хочу узнать как все таки верно

в доках указывается что вроде как нужно коллекционировать айди записей и добавлять их пользователю

Cyber
15.05.2017
08:14:18
Инкрементить счетчик при добавлении записи пользователя
просто используя key-value я бы при выборке посчитал бы все записи пользователя в отдельной таблице, в монге как я понимаю это не совсем правильное решение, верно?

Google
Sergey
15.05.2017
08:15:34
Инкрементить счетчик при добавлении записи пользователя
Потом обязательно где-нибудь разъедется. Count по индексу довольно дешёвый. Только надо в сообщения логин положить, а не связь с objectid. Логин же уникальный скорее всего?

Sergey
15.05.2017
08:16:49
да, логин уникальный, а чем плоха связь через _id?
Тем, что это типичный sql-подход. А чем плохо - вот наше обсуждение тут говорит о том, чем плохо

Cyber
15.05.2017
08:18:18
Не понятна целиком задача, мало инфы
задача довольно простая - вывожу список пользователей и у каждого указываю количество записей, пользователь и запись связаны через _id

Тем, что это типичный sql-подход. А чем плохо - вот наше обсуждение тут говорит о том, чем плохо
извини, перечитал переписку но не догнал чем плохо, можешь объяснить, пожалуйста? Хочу понять.

Sergey
15.05.2017
08:20:44
извини, перечитал переписку но не догнал чем плохо, можешь объяснить, пожалуйста? Хочу понять.
Чтобы достать сообщения одного пользователя в случае с id надо делать или два запроса или lookup. При этом, более сложные запросы уже будут достаточно неэффективными.

Cyber
15.05.2017
08:21:44
Чтобы достать сообщения одного пользователя в случае с id надо делать или два запроса или lookup. При этом, более сложные запросы уже будут достаточно неэффективными.
понимаю, а почему в случае с username нет? ведь придется выбирать так же 2 запросом или через лукап, но связывать через другое поле?!

Cyber
15.05.2017
08:23:35
Потому что username уже лежит в каждом сообщении
так ведь и _id тоже, в мое случае будет Post.find({ _author: req.user.id }, а в случае с uname Post.find({ _author: req.user.name } ?!

Sergey
15.05.2017
08:23:46
И посчитать количество сообщений - простейший count по логину

Sergey
15.05.2017
08:24:37
задача довольно простая - вывожу список пользователей и у каждого указываю количество записей, пользователь и запись связаны через _id
эффективная структура данных зависит не от того что есть а от того как это обновляется и как достаётся Например у меня есть большой объект пользователь в нём есть блок Stat в котором gameCount - счётчик игр когда пользователь сыграл игру, этот счётчик инкрементится когда нужно отобразить статы, я просто считываю этот блок Stat со всеми статами и показываю в профиле всё просто и никаких долгих агрегатных запросов ничего не рзъезжается

Sergey
15.05.2017
08:28:10
у меня все операции атомарные, нет никаких двух запросов
Ну так речь была про инкремент счётчика, он явно лежит не в сообщении. А значит добавление сообщения и инкремент счётчика - два разных запроса

Sergey
15.05.2017
08:28:48
тоесть все таки правильней заносить данные в документ при выполнении действий, а не считать связанные документы при каждой выборке?
если нужно моментально доставать профиль - то должно быть всё заранее расчитано если не нужно моментально - то можно считать во время запроса

Sergey
15.05.2017
08:32:12
Тогда да, верно - два запроса, а что может случиться ?
Сообщение может добавиться, а инкремент - не пройти

Google
Sergey
15.05.2017
08:34:33
Почему ?
Пр любой причине: лаг сети, база упала или что-то ещё

Igor
15.05.2017
08:34:58
если база упала, наверное, есть причины для беспокойства поважнее, чем рассинхрон счетчиков, не?)

Sergey
15.05.2017
08:35:55
А если щарды, то запись вообще может быть в разные primary

Sergey
15.05.2017
08:35:59
если база упала, наверное, есть причины для беспокойства поважнее, чем рассинхрон счетчиков, не?)
Вот именно ) Если это инфа архи важная например банковский счёт с деньгами, то следает предусмотреть механизм транзакций на сервере, для таких операций.

Sergey
15.05.2017
08:38:44
Пр любой причине: лаг сети, база упала или что-то ещё
а что лаг, как он не даст заинкрементить счётчик ?

Stefan
15.05.2017
08:39:38
Пользуюсь счётчиками, брат жив, зависимости нет.

Делаю переиндексацию раз в месяц, когда мне больше делать нечего.

Рассинхрон бывает редко.

Sergey
15.05.2017
08:40:42
а что лаг, как он не даст заинкрементить счётчик ?
Ну зависит от того как бек настроен, наверное не лучший вариант при вставке висеть 10+ секунд без ответа пользователю, пытаясь повторить вставку в общем-то не критичного счётчика

Stefan
15.05.2017
08:42:20
С очередью ещё одна проблема появляется)
Это так. В моём случае счётчики не содержат важную величину (деньги или ещё что-то такое), поэтому я могу позволить себе небольшую погрешность. Правда, как я уже говорил, рассинхрон бывает очень редко.

Sergey
15.05.2017
08:44:05
Ну зависит от того как бек настроен, наверное не лучший вариант при вставке висеть 10+ секунд без ответа пользователю, пытаясь повторить вставку в общем-то не критичного счётчика
Причём тут висеть, мы же о целостности разговаривали и транзакциях У меня реактивная архитектура (Akka actors) там ничего не блокируется, вставка выполнится через 10 сек обоих записей. При этом запросы продолжат обрабатываться. Учитывай вероятности возникновения событий. Те вещи про которые ты пишешь случаются раз в год или реже (у меня к примеру ниразу так до сих пор база не падала в продакшене за два года)

Sergey
15.05.2017
08:47:46
ну понятно, просто это счётчики, если у одного из пользователей он нарушится на 1, за два года работы и то если сильно не повезёт. То в этом нет ничего страшного. Если они важны реализуй транзакции. Но имхо это лишнее

Соотноси ценность инфы и затраты

Google
Sergey
15.05.2017
08:54:05
В случае с отложенной вставкой ещё надо реализовывать 2PC иначе больше проблем, чем пользы. Пользователь на свое действие получил ок, а данные до базы не доехали.
в штатном режиме который в 99.999999% данные доезжают моментально, и берутся они не из базы а из сессий в большинстве случаев а там они обновляются сверх моментально )

Sergey
15.05.2017
09:00:54
Сессии на стороне браузера? А как синхронизация происходит?

Sergey
15.05.2017
09:01:48
У меня сессионная игра. Сессия на сервере

Sergey
15.05.2017
09:02:13
И один бекенд?

Sergey
15.05.2017
09:03:12
Когда игрок заходит - загружается его сессия (профиль и вся инфа). Далее все обновления вносятся вначале в сессию а затем сессия дёргает бд и записывает в базу.

Пока один сервер, который при нагрузочном тестировании держал 60к CCU. Пока это гораздо больше чем игроков ) А потом возможно будем масштабировать

Пошаговая сессионка, мобильная игра, типа HeartStone

Sergey
15.05.2017
09:04:56
Ну если сервер один, то да - проблем в синхронизации нет

Sergey
15.05.2017
09:05:10
А если 2

Просто половина игроков будут направлены на другой бэкенд и всё тоже самое

Sergey
15.05.2017
09:05:58
Если два, то эти сессии уже надо как-то синхронизировать

Sergey
15.05.2017
09:06:15
ненада

Igor
15.05.2017
09:06:44
игрок же не может одновременно дважды из-под одного акка зайти?

Sergey
15.05.2017
09:09:06
А с чем их синхронизировать ?
Между двумя серверами.

Sergey
15.05.2017
09:15:16
ну это не синхронизация а роутинг т.е. есть load balancer который один на кластер, и который распределяет по серверам игроков, и знает кто где сидит (по Id) и переправляет запросы Это имеется ввиду ? При традиционном подходе как то так делается. Но с Akka проще. Во первых акторы поддерживают location transparency. (т.е. акторы можно разнести по машинам и они также будут работать как и на одной, при этом код их не поменяется. А также в Akka Cluster есть готовые примитивы, для построения распределённых систем. Типа Cluster Singleton, различные балансеры, которые раскидывают работу в зависимости от нагрузки на ноду, или по каким либо другим правилам ...

Sergey
15.05.2017
09:20:47
Ну если akka такая крутая и все делает за разработчика, то ок. Я хз что это, первый раз слышу.

Google
redbeard
15.05.2017
09:22:41
это ббилиотека для работы с акторами

есть и для скалы, и для C#

Sergey
15.05.2017
09:23:35
Да, её использует Ebay , Blizzard, CISCO, BBC и другие никому неизвестные компании

redbeard
15.05.2017
09:23:55
what'sapp все равно написан на erlang :)

а вот вопрос: подписка на что в кластере требуется? что отлавливаем?

Sergey
15.05.2017
09:24:37
да это Erlang тоже акторы, похож на Akka

Sergey
15.05.2017
09:24:45
redbeard
15.05.2017
09:25:12
Sergey
15.05.2017
09:26:15
Вот уж не думал, что ebay на дотнете работает
Ты не то нагуглил Восновном Akka + Scala , Akka + Java на JVM - популярны

а вот вопрос: подписка на что в кластере требуется? что отлавливаем?
Отлавливать вход выход нод из кластера, загрузку нод и прочее

наоборот :)
Есть и такое мнение )

redbeard
15.05.2017
09:29:44
Отлавливать вход выход нод из кластера, загрузку нод и прочее
хм... это в нормальной платформе давно есть :)

Есть и такое мнение )
это не мнение, ибо ирлонг с 1987 года существует :)

2 Сергея пишут, пойду желание загадывать

Sergey
15.05.2017
09:30:41
хм... это в нормальной платформе давно есть :)
Получается Акка нормальная платформа ? )

Sergey
15.05.2017
09:30:42
Отлавливать вход выход нод из кластера, загрузку нод и прочее
Я больше сторонник классического подхода: haproxy + quagga)

redbeard
15.05.2017
09:30:48
Скала - то еще чудо

Sergey
15.05.2017
09:31:25
Я в проекте использую Java + Akka + MongoDB

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