
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/

AstraSerg
06.08.2018
11:57:27

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

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

AstraSerg
06.08.2018
12:11:16

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

Google

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

Vasiliy
06.08.2018
12:16:17

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. Вы группируете по пользователю, значит первое поле будет Вася. А какую дату взять во второе поле? Максимальную? минимальную? Среднюю? Это за вас никто не решит

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
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

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

Vasiliy
06.08.2018
12:35:45
3 секунды
в среднем
но created_at даже без индекса быстрее _id

AstraSerg
06.08.2018
12:41:23
может что-то проясниться...

Vasiliy
06.08.2018
12:41:45
ну кстати
добавил индекс на поле created_at и сорт начал тормозить

AstraSerg
06.08.2018
12:44:24

Google

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

AstraSerg
06.08.2018
12:49:54

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

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

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

Vasiliy
06.08.2018
12:58:32

Google

AstraSerg
06.08.2018
12:59:21

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

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

AstraSerg
06.08.2018
13:05:42

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

AstraSerg
06.08.2018
13:07:44

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"=>[]}}}


AstraSerg
06.08.2018
13:17:19
{"$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"=>[]}}}
Хм... Индекс используется. А вот этот запрос что вернёт: db.coll_name.count({"key": {$in: [2234, 2255]}})

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"
}
]

AstraSerg
06.08.2018
13:29:32
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"
}
]
тут размера нет. покажите
var r = db.coll_name.stats()
r["indexSizes"]