@MongoDBRussian

Страница 282 из 342
Vasiliy
06.08.2018
11:48:40
но в строках числа

AstraSerg
06.08.2018
11:49:20
Vasiliy
06.08.2018
11:52:57
у меня в бд есть значение value, где может быть строка или число (-1, 0, "1235) я сохраняю как есть код на рубях, но понятно должно быть .aggregate([{'$match': {id: 2234}}, {'$group': {_id: '$id', value: { '$sum': '$value'}}}]) (вообще надо последнюю запись выбрать, но пока хочу хотя бы со всеми сделать) хочу на выходе получить сумму всех value как число, не зависимо от типа value

Google
Nick
06.08.2018
11:55:04
Если монга 4 версии то можно использовать https://docs.mongodb.com/manual/reference/operator/aggregation/toInt/

Vasiliy
06.08.2018
11:57:49
а чего, как гуглил?

AstraSerg
06.08.2018
11:58:05
а чего, как гуглил?
https://www.google.com/search?newwindow=1&client=ubuntu&hs=Frg&channel=fs&q=mongodb+string+to+int&spell=1&sa=X&ved=0ahUKEwjy6_2jrdjcAhUEQpoKHdQODKIQBQgmKAA&biw=1080&bih=1817

Vasiliy
06.08.2018
11:58:47
хм, я думал в aggregation как-то по особенному

тэкс, оказалось что то что мне нужно это $last

слушайте, а какой порядок у полей по дефолту? .aggregate([{ '$match': { key: 2234 } }, { '$sort': { _id: -1 } }, { '$group': { _id: '$key', value: { '$first': '$value' } } }]) делаю так, всё ок, но очень медленно возвращается результат делаю так вот .aggregate([{'$match': {key: 2234}}, {'$group': {_id: '$key', value: { '$last': '$value'}}}]) очень быстро, но чёт смущает что может быть порядок не верный и как можно всю last строку вернуть, а не только одно поле?

AstraSerg
06.08.2018
12:10:08
тэкс, оказалось что то что мне нужно это $last
обратите внимание, что он имеет смысл только если отсортировано

Vasiliy
06.08.2018
12:11:03
отсортировано - значит sort в aggregation применен?

AstraSerg
06.08.2018
12:11:16
отсортировано - значит sort в aggregation применен?
да, конечно. Иначе порядок не гарантирован

Vasiliy
06.08.2018
12:11:54
а, вон как, а то у меня без сорта очень быстро проходит и результат даже одинаковый

чем с сортом

а как-нибудь sort можно ускорить? там sort по _id, я в монге новый человек, на _id по дефолту нет индекса?

Google
AstraSerg
06.08.2018
12:13:21
> и как можно всю last строку вернуть, а не только одно поле? Для этого нужно в $group добавить все нужные поля

а как-нибудь sort можно ускорить? там sort по _id, я в монге новый человек, на _id по дефолту нет индекса?
Индекс есть, только прямой, попробуйте отсортировать '$sort': { _id: 1 } и взять не $last а $first

AstraSerg
06.08.2018
12:17:01
грустно
Это ж логично. Чё грустить?

Vasiliy
06.08.2018
12:17:39
ну у меня есть отчеты по сессиям в монге для пользователей

мне бы хотелось взять для всех пользователей по последнему отчету

в принципе такое { '$sort': { created_at: -1 } } быстрее чем по _id

AstraSerg
06.08.2018
12:21:13
вот смотрите: у вас пользователь Вася, скажем. Записи о нём: Вася - 2018-06-06, Вася - 2018-06-07, 2018-06-08. Вы группируете по пользователю, значит первое поле будет Вася. А какую дату взять во второе поле? Максимальную? минимальную? Среднюю? Это за вас никто не решит

в принципе такое { '$sort': { created_at: -1 } } быстрее чем по _id
У вас какие индексы на коллекции? db.<имя коллекции>.getIndexes()

Bro
06.08.2018
12:22:51
для сорта нужен индекс на поле

если большая база

сорт кстати по _id можно делать насколько я помню

AstraSerg
06.08.2018
12:23:39
для сорта нужен индекс на поле
Ага, можно конечно и без индекса, если ресурсов не жалко :) и порядок важен. Вот здесь можно почитать: https://docs.mongodb.com/manual/indexes/

Bro
06.08.2018
12:24:27
монговский ид же тоже со временем

и можно его сортировать

Vasiliy
06.08.2018
12:24:33
сорт кстати по _id можно делать насколько я помню
так оно медленно в данном случае

10 сек против сотых

на created_at индекса нет

AstraSerg
06.08.2018
12:25:50
а сколько документов в коллекции?

Vasiliy
06.08.2018
12:26:16
261244

Google
Bro
06.08.2018
12:26:44
фигня

у меня вот щаз на одной коллекции не влезает результат

AstraSerg
06.08.2018
12:27:28
261244
не так что бы много, но имеет смысл сделать индекс. Только почитайте сначала про индексы, что бы сделать такой, который будет использоваться на максимальном количестве запросов

Vasiliy
06.08.2018
12:28:01
мне больше интересно почему сорт по _id так медленно работает

и не будет ли тормозов когда добавлю индекс на created_at

AstraSerg
06.08.2018
12:28:43
и не будет ли тормозов когда добавлю индекс на created_at
Тормозов на чтение увеличиться не может. На запись - увеличится, но принебрежительно мало

Bro
06.08.2018
12:31:20
а что реально сортировка по _id медленнее индекса по времени работает?

Vasiliy
06.08.2018
12:32:58
на поле времени нет индекса

AstraSerg
06.08.2018
12:33:22
Vasiliy
06.08.2018
12:34:07
ну вот c { '$sort': { created_at: -1 } } - SUCCEEDED | 0.02214646s c { '$sort': { _id: -1 } } - SUCCEEDED | 10.304851694s

AstraSerg
06.08.2018
12:35:31
ну вот c { '$sort': { created_at: -1 } } - SUCCEEDED | 0.02214646s c { '$sort': { _id: -1 } } - SUCCEEDED | 10.304851694s
если -1, то индекс использоваться не будет. Проверьте с { '$sort': { _id: 1 } }

Vasiliy
06.08.2018
12:35:45
3 секунды

в среднем

но created_at даже без индекса быстрее _id

AstraSerg
06.08.2018
12:41:23
но created_at даже без индекса быстрее _id
Это странно... Можно попробовать поковырять explain https://docs.mongodb.com/manual/reference/operator/meta/explain/

может что-то проясниться...

Vasiliy
06.08.2018
12:41:45
ну кстати

добавил индекс на поле created_at и сорт начал тормозить

Google
Vasiliy
06.08.2018
12:46:05
explain говорит что sort если на нем нет индекса вообще не участвует

AstraSerg
06.08.2018
12:49:54
explain говорит что sort если на нем нет индекса вообще не участвует
Вам нужно сделать такой индекс, который будет использоваться при сортировке. Важно, что бы совпадал набор полей, по которым будет сортировка и направление 1 или -1

Vasiliy
06.08.2018
12:52:09
ну я его делаю db.collection_name.createIndex({'created_at': 1}) добавляю потом в агрегацию { '$sort': { created_at: 1 } } и работает дольше на 3 сек чем без индекса

AstraSerg
06.08.2018
12:53:29
Vasiliy
06.08.2018
12:53:46
стейджи?

аа

AstraSerg
06.08.2018
12:54:36
стейджи?
ну $match, $group и т.п.

Vasiliy
06.08.2018
12:54:50
понял, сейчас

Andrew
06.08.2018
12:55:03
Чутка вклинюсь, а коллекция большая вообще?

AstraSerg
06.08.2018
12:55:33
Vasiliy
06.08.2018
12:55:37
261244
уот

Andrew
06.08.2018
12:55:54
Т.е. это все лежит так и так в оперативке

и индекс делу не должен помочь

но вот чтобы ухудшило...

Vasiliy
06.08.2018
12:56:22
рубишный код [ { '$match': { key: { '$in': [2234, 2255] } } }, { '$sort': { created_at: 1 } }, { '$group': { _id: '$key', last: { '$last': '$value' } } } ] на key индекс есть

AstraSerg
06.08.2018
12:56:30
Т.е. это все лежит так и так в оперативке
Не факт, мало ли что там на сервер за ситуация...

Andrew
06.08.2018
12:57:20
Монга для 200тыс записей оперативку всегда сожрет :))) Ну не факт конечно

AstraSerg
06.08.2018
12:58:17
рубишный код [ { '$match': { key: { '$in': [2234, 2255] } } }, { '$sort': { created_at: 1 } }, { '$group': { _id: '$key', last: { '$last': '$value' } } } ] на key индекс есть
Давайте по другому проверим. Сделайте такой замер: db.coll_name.find().sort({ created_at: 1 }) с и без индекса

Google
AstraSerg
06.08.2018
12:59:21
пробовал менять местами матч и сорт, но разницы не особо заметил
match должен быть на первом месте, он сокращает датасет для следующего стейджа

Vasiliy
06.08.2018
12:59:35
ну я так и подумал

а, ну вот

без индекса "errmsg" : "Executor error during find command :: caused by :: errmsg: \"Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.\""

а чего оно тогда в агрегации работает)

AstraSerg
06.08.2018
13:04:12
а чего оно тогда в агрегации работает)
в агрегации до 100мегабайт лимит https://docs.mongodb.com/manual/core/aggregation-pipeline-limits/#memory-restrictions

Vasiliy
06.08.2018
13:05:11
чото я походу понял, в агрегации норм работает потому что матч режет много записей, остаток помещается в памяти и быстро сортируется, а с индексом сортировка лезет в индекс

Vasiliy
06.08.2018
13:06:58
в експлейне, если без индекса смотреть, обращение к created_at только в fields, если индекс присутствует то появляется sort и там так же есть created_at

Vasiliy
06.08.2018
13:08:20
С индексом и без?

AstraSerg
06.08.2018
13:09:08
без индекса не нужно, там нечего сомтреть

Vasiliy
06.08.2018
13:09:22
Хорошо, скину

{"$cursor"=> {"query"=>{"key"=>{"$in"=>[2234, 2255]}}, "sort"=>{"created_at"=>1}, "fields"=>{"value"=>1, "key"=>1, "_id"=>0}, "queryPlanner"=> {"plannerVersion"=>1, "namespace"=>"db.collection", "indexFilterSet"=>false, "parsedQuery"=>{"key"=>{"$in"=>[2234, 2255]}}, "winningPlan"=> {"stage"=>"FETCH", "filter"=>{"key"=>{"$in"=>[2234, 2255]}}, "inputStage"=> {"stage"=>"IXSCAN", "keyPattern"=>{"created_at"=>1.0}, "indexName"=>"created_at_1", "isMultiKey"=>false, "multiKeyPaths"=>{"created_at"=>[]}, "isUnique"=>false, "isSparse"=>false, "isPartial"=>false, "indexVersion"=>2, "direction"=>"forward", "indexBounds"=>{"created_at"=>["[MinKey, MaxKey]"]}}}, "rejectedPlans"=>[]}}}

Vasiliy
06.08.2018
13:18:18
1767

AstraSerg
06.08.2018
13:20:34
получается фуллскан по 1767 документам быстрее чем по индексу из 200тыс строк, что не исключено. А ещё покажите db.coll_name.getIndexes() Интересно какой размер индекса

Vasiliy
06.08.2018
13:21:33
тут ещё интересно что по времени у меня гроуп по всей коллекции примерно одинаково что после матча

AstraSerg
06.08.2018
13:22:29
если используется дефолтное время, то там точность до миллисекунд. Если не брать экстремальные условия (более 1000 инсертов в секунду) от такого индекса мало толку.

Vasiliy
06.08.2018
13:23:05
db.collection.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "db.collection" }, { "v" : 2, "key" : { "key" : 1 }, "name" : "key_1", "ns" : "db.collection" }, { "v" : 2, "key" : { "created_at" : 1 }, "name" : "created_at_1", "ns" : "db.collection" } ]

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