
Nan0
23.06.2018
21:13:45
вот читаю "You cannot deploy a M0 Free Tier or M2/M5 shared cluster as a Sharded Cluster."
https://docs.atlas.mongodb.com/reference/free-shared-limitations/#atlas-free-tier, это значит, что я могу деплоить только с помощью реплик?

Ivanov
24.06.2018
13:39:58
Привет. Подскажите в mongo
Делаю group выполняется быстро
Делаю lookup который пару полей лепит к документу выполяется быстро
Делаю lookup + group - выполняется в 100 раз дольше
Куда копнуть?

Ruslan
24.06.2018
14:25:44

Ivanov
24.06.2018
14:30:36
Вроде точно так же работает, время выборки не изменилось

Google


Ivanov
24.06.2018
14:30:37
db.clients_data_info.aggregate( [
{ "$lookup" : { "from" : "inn2markets" , "localField" : "inn" , "foreignField" : "inn" , "as" : "inn2markets"}} ,
{ "$group" : { "_id" : "$clientId" , "clientDataInfos" : { "$push" : "$$ROOT"}}}
]
)
db.clients_data_info.aggregate( [
{ "$lookup" : { "from" : "inn2markets" , "localField" : "inn" , "foreignField" : "inn" , "as" : "inn2markets"}} ,
{ "$unwind": "$inn2markets"},
{ "$group" : { "_id" : "$clientId" , "clientDataInfos" : { "$push" : "$$ROOT"}}}
]
)
Структура там такая
clients_data_info
_id
name
inn
clientId
Нам надо по inn из другой таблицы цепануть информацию о магазине (наименование)
И потом сгруппировать их по clientId
Вот так вот
db.clients_data_info.aggregate( [
{ "$lookup" : { "from" : "inn2markets" , "localField" : "inn" , "foreignField" : "inn" , "as" : "inn2markets"}} ,
]
)
0.002 с выполняется
db.clients_data_info.aggregate( [
{ "$group" : { "_id" : "$clientId" , "clientDataInfos" : { "$push" : "$$ROOT"}}}
]
)
0.337 с
db.clients_data_info.aggregate( [
{ "$lookup" : { "from" : "inn2markets" , "localField" : "inn" , "foreignField" : "inn" , "as" : "inn2markets"}} ,
{ "$group" : { "_id" : "$clientId" , "clientDataInfos" : { "$push" : "$$ROOT"}}}
]
)
а вот так 9 секунд


Nick
24.06.2018
14:37:01
а вы берете время до поулчения первого элемента или время полной вычитки всех данных из ответа? сдается мне что вы замеряете время получения курсора, а оно никак не корреклирует с выборкой. а в случае с думя стейджами у вас идет как раз полный проход по данным на стороне базы до момента когда вам вернули курсор. так что начинайте мерить время от начала запроса вычитки абсолютно всех данных из курсора
тогда увидите что время на самом деле +- одинаковое

Ivanov
24.06.2018
14:38:23
Я мерю по тому что показывает Robot 3T.
На самом деле конечный запрос еще огромнее, и выполняется в боевой среди 90секунд
надо сократить до 2-3с

Nick
24.06.2018
14:40:02
начните с експлейнов
если вам нао быстро - перестраивайте данные, делайте преагрегаты

Ivanov
24.06.2018
14:44:28
Может быть такое что чисто group выполняется по индексу, а когда делаешь сначала lookup потом group, group делается не по индексу?

Nick
24.06.2018
14:48:30
нет, груп не использует индексы

Google

Gleb
24.06.2018
18:32:47
Всем привет! Вопрос из серии best practices: имеет ли смысл держать в модели два ID-шника - один ObjectId, другой автоинкримент для генерации человеческих ссылок типа /user/324? или лучше сразу основной id сделать автоинкриментирующимся?


Bat
25.06.2018
04:53:58
ребята. нужно некоторое пояснение. переношу проект с монго2 на 3. по сути 2 коллекции, в одной 600 записей, в другой 6000.
изза формы поступающих данных загоняю данные в 1ую, потом во 2ую. и после, некоторой математики, обновляю все позиции во второй (скажем пробиваю новые цены). В обоих случаях upsert. Потом "анализ" второй (обычный find с математикой не связанной со вставками)
между пунктом 2 и 3 у меня дичайшая задержка в 2.5 минуты
включаю лог, а там в это время валится потоком нечто типа
mongo_1 | 2018-06-25T04:37:44.718+0000 I COMMAND [conn66] command admin.$cmd command: endSessions { endSessions: [ { id: UUID("23ed5952-34b9-4071-b8ec-353fe00bb38f") } ], $readPreference: { mode: "secondaryPreferred" }, $db: "admin" } numYields:0 reslen:37 locks:{} protocol:op_query 0ms


Nick
25.06.2018
14:22:53
@dd_bb подскажи есть ли в монге возможность при автобалансирвоании шардов указать приоритет, например если ест ьперекос между размером шардов, то чтобы в первую очередь сливало с самого тяжелого шарда, а не как повезет?

yopp
25.06.2018
14:53:46

Nick
25.06.2018
14:57:11
да вот тоже порыскал по докам и интернетам - тишина

Sergey
25.06.2018
20:34:45

Nick
25.06.2018
20:37:08
Это было актуально перед пепвой заливкой данных. Тогда были вручную разбиты диапазоеы ключей по мощности и раскиданы на тот момент еще пустые чанки по шардам. Но сейчас это сделать вручную нереально, данных слишком много да и размер чанка в среднем 250 метров
Он пепеносится на другой шард пару часов

Sergey
25.06.2018
20:40:42

Nick
25.06.2018
20:43:23
Смысла разбивать нет, мощность ключа лишь в 5 раз больше текущего количества чанков(40к) при условии, что часть из низ уже неперемещаемы изза лимитов на вес либо количество доков внутри
Да и контролить работу скрипта както накладно, е ли опять же вспомнить что стандартеый балансер умеет параллелиться, а в скрипте это придется уже реализовывать мне

Sergey
25.06.2018
20:48:19

Nick
25.06.2018
20:48:36
Про одновременное

W360
26.06.2018
03:31:32
Есть у кого линк на конфу в тг по mariadb ?

yopp
26.06.2018
08:17:14

Dmitrii
26.06.2018
10:15:54
есть массив из 30 id, и коллекция например из 100000 записей, подскажите, каким методом воспользоваться, чтобы узнать какой из этих 30 id еще не находится в коллекции?

Nick
26.06.2018
10:17:30

Dmitrii
26.06.2018
10:17:41
?

Bandikoot
26.06.2018
10:18:35

Google

Nick
26.06.2018
10:18:42
если стоит задача просто залить данные, то можно просто через upsert true перезатереть

Bandikoot
26.06.2018
10:19:25
так в результате будет около 99971 записей

Dmitrii
26.06.2018
10:19:27
не это не то
мне не нужено выбрать все записи, мне нужно понять какие из 30 еще не находятся в БД

Nick
26.06.2018
10:20:23
$in

Алишер
26.06.2018
10:20:43
Добрый день. подскажите как такое возможнО, что у арбитра лежит коллекция на 40+ гб?

Nick
26.06.2018
10:20:48
потом вычитание результат из текущего массива

Dmitrii
26.06.2018
10:20:53
точно

Vadim
26.06.2018
14:10:22
Добрый день! Необходимо мнение специалистов в области MongoDb. Как лучше организовать пагинацию на фронте, используя mongodb? Ведь дял пагинации необходимо знать зараннее общее колличество элементов ну и сами отсупы и колличество выбираемых элементов. Что бы не обращаться пару раз к базе, можно ли такое реализовать одним запросом? И желательно без агрегации?

Stepan
26.06.2018
14:12:23
А как вы хотите из бд отсупы и колличество выбираемых элементов узнать?

Vadim
26.06.2018
14:14:21
Конечно отсупы и выбираемые элементы приходят с клиента. Я к тому, что бы всю эту выборку реализовать одним запросом и без аггрегации(если такое возможно)

Stepan
26.06.2018
14:15:45
Вся выборка ето что?
Нужные элементы?
И их количество?

Vadim
26.06.2018
14:18:39
Ну допустим у меня есть в базе 1000 элементов. И на клиенте реализована пагинация в колличестве по 10 элементов при каждом скроле. Допустим он пришлет мне limit=10, offset=0. Я ему в ответ первые 10 элементво и total = 1000;
Возможно как то одни запросом выбрать конкретные элементы и получить общее колличество?

Nick
26.06.2018
14:29:15
можно поизвращаться с https://docs.mongodb.com/manual/reference/operator/aggregation/facet/
но сразу можете забыть про индексы

Stepan
26.06.2018
14:31:55
Удобная вещь
Но, разве оно не будет использовать индекс для обычного $match

Google

Stepan
26.06.2018
14:32:19
?

Nick
26.06.2018
14:33:37
может и будет, надо тестить, но я чтото не верю что последующий стейдж будет использовать индекс для скип/лимита и подсчета количества

Sergey
26.06.2018
15:24:12
Ещё стоит готовиться к тому, что count в монге имеет сложность O(N). Кроме тех случаев, когда речь идёт о количестве всех документов коллекции.
Ну и в шардированных коллекциях будет обманывать в большую сторону.

Crazy
27.06.2018
11:49:28
Привет парни. Как сгруппировать данные по часам?
У меня хранится объект такого типа:
{
_id:5b327abba7bd45090fecc556,
pair:BTC-BAT,
date:2018-06-26T17:41:15.126Z,
volume: 76160.96741849463,
askName:liqui,
bidName:bittrex,
askPrice:0.0000371714305997196,
bidPrice:0.000037914859211713974
}
Понял. Нужно было сделать так: {
$group: {
_id: { $hour: "$date" }
}
}

Bat
27.06.2018
14:00:00
ребята, про блокировки в wiredtiger. пишу в одну коллекцию, читаю из другой. результат получаю только когда запись прошла. почем глобальный лок то?

Slava
27.06.2018
14:57:05

Andruha
27.06.2018
15:15:16
const t1 = await Model.find().populate('log');
Должно так работать в монгусе? Нужны все записи модели с запопулейченными рефками. Чет не популейтит вот так, как я выше написал.
const modelSchema = new Schema(
{
log: {
type: Schema.Types.ObjectId,
ref: 'log',
unique: true
},
status: {
type: Number,
required: true,
index: true
}
},
{
timestamps: {
createdAt: 'created_at',
updatedAt: 'updated_at'
}
}
);
даже если findOne делать, то хрен

Yurii
27.06.2018
15:17:23
а модель 'log' объявлена?

Andruha
27.06.2018
15:19:29
ммм, где она должна быть объявлена?

Yurii
27.06.2018
15:21:00

Andruha
27.06.2018
15:22:28
ну конечно это есть у каждой модели

Yurii
27.06.2018
15:22:54

Andruha
27.06.2018
15:23:16
log: {
type: Schema.Types.ObjectId,
ref: 'log',
unique: true
}
из-за unique здесь не может быть проблем? ща уберу попробую

Gleb
27.06.2018
15:24:23
Привет! Подскажите пожалуйста, кто реализовывал микросервисную архитектуру с несколькими типами пользователей, как лучше организовать хранение пользовательских данных - в разных сервисах для разных типов пользователей, или разные collections для разных типов юзеров в одном пользовательском сервисе? + сервис авторизации отдельно