@MongoDBRussian

Страница 257 из 342
Александр
08.06.2018
18:50:58
Народ, запрос на добавление в массив поддокументов вместе со $slice -12890 будет сильно ресурсы жрать? Ожидается таких запросов около сотни последовательных раз в 10 минут

Sergey
08.06.2018
19:31:16
привет

подскажите как, например, посчитать сколько комментариев имеет каждый пост. например, у нас есть список айдишников постов, нужно получить количество комментариев каждого

Александр
08.06.2018
20:23:42
Смотря как комментарии хранятся

Google
Sergey
08.06.2018
20:49:19
в отдельной коллекции

yopp
08.06.2018
21:40:52
в отдельной коллекции
Aggregation framework: в коллекции комментариев Match с in по массиву id постов group по id постов с sum: 1

Sergey
09.06.2018
07:37:35
спасибо

Артем
09.06.2018
08:17:08
парни как взять первый элемент из группы?

db.grades.find().sort({student_id: 1, score: 1}) вот теперь из него нужно сгруппировать по полю student_id, и взять первый элемент

invzbl3
09.06.2018
09:58:47
авторизация вкл?
нет. я решил проблему добавив в конфиг пару строчек: replication: replSetName: "rs0" net: bindIp: localhost,<IP>

Viktor
10.06.2018
02:52:54
Есть findOne

Artem
10.06.2018
02:58:31
cursor.limit() не поможет?

Артем
10.06.2018
03:34:17
С каждой группы по 1 элементу

А ваши варианты просто 1 элемент вернет

Google
rdcm
10.06.2018
08:07:27
https://docs.mongodb.com/manual/reference/operator/aggregation/facet/

invzbl3
10.06.2018
12:17:07
делаю запроc db.grades.find({},{_id: 0}, {type: "homework", score: 1}).sort( { score: 1 } ).pretty(),но получаю не только homework значения ключа type, а и другие... что исправить, подскажите, пжл?

выводит такого плана { "student_id" : 191, "type" : "exam", "score" : 0.03425228241156208 } { "student_id" : 50, "type" : "homework", "score" : 0.1170101023771353 } { "student_id" : 13, "type" : "homework", "score" : 0.4838914493376478 } { "student_id" : 74, "type" : "homework", "score" : 0.494513588220491 } { "student_id" : 186, "type" : "exam", "score" : 0.6651311278067396 }

Артем
10.06.2018
12:19:02
ты че проходишь курсы по монго?))

invzbl3
10.06.2018
12:20:00
{_id:0, homework:1}
спасибо, а почему мой вариант не сработает?

если вынести в отдельные скобки, допустим?

Nick
10.06.2018
12:20:35
посмотрите спеку на метод find

и что там значит 3 объект

Старый
10.06.2018
14:00:13
Дак редис
?мастабирвоание - пока данные, перенос - пока данные, распределённость, вообще не существует

Dmitry
10.06.2018
14:10:47
Всем привет, need help: db.documents.find({ "$or": [ {"$expr": {"$gt": ["$docDownloadDate", "$searchIndexSyncDate"]}}, {"searchIndexSyncDate": null}, ], "docProcessedSuccessfully": true, }).limit(10000) страшно тупит до 3-5 минут, индексы по docDownloadDate, searchIndexSyncDate, docProcessedSuccessfully есть Если отдельно запрашивать по $expr - работает быстро, если отдельно {"docProcessedSuccessfully": true}, тоже но когда вместе через $and тупит :( может кто-то сталкивался?

ну и вообще вопрос по $expr и сравнении двух полей одного докумнта: mongodb никак не хочет использовать для этого индексы, добавить partialindex на это выражение я так понял тоже нельзя...

если слишком нагло ворвался - плиз сильно не бейте :)

Nick
10.06.2018
14:32:40
чтобы проверить факт использования индексов или их не использования нужно дернуть explain(executionStats) может улучшит понимание https://docs.mongodb.com/manual/reference/method/cursor.explain/#cursor.explain

ну и вообще вопрос по $expr и сравнении двух полей одного докумнта: mongodb никак не хочет использовать для этого индексы, добавить partialindex на это выражение я так понял тоже нельзя...
вообще то что вы ищете называется примерно Expression Indexes, такого в монге нет. Но вы можете самостоятельно вычилят ьи сохранят ьв документе результат а его уже индексирвоать

Dmitry
10.06.2018
14:40:15
вообще то что вы ищете называется примерно Expression Indexes, такого в монге нет. Но вы можете самостоятельно вычилят ьи сохранят ьв документе результат а его уже индексирвоать
да, проблема в том что я каждые N дней должен делать upsert всех документов с новой датой, чтобы посчитать все нужно будет снова обходить каждый документ, а их 10+ миллионов...

Nick
10.06.2018
14:44:20
вот это вот upsert какая вцелом логика? ну там обновление каталога товаров и проставление актальных данных

Dmitry
10.06.2018
14:46:17
вот это вот upsert какая вцелом логика? ну там обновление каталога товаров и проставление актальных данных
все что нужно - обновить метаданные документов: у каждого есть дата последней публикации и ссылка на сам текст. По дате публикации я должен понять скачал ли я уже текст или нет, нужно ли мне обновить текст (если дата публикации старше даты скачивания) или нет

Google
Dmitry
10.06.2018
14:46:49
но "executionTimeMillis" : 117415,

Nick
10.06.2018
14:47:28
закиньте в гист каконить

Dmitry
10.06.2018
14:49:30
закиньте в гист каконить
https://gist.github.com/t4ec/61bc15db83f89b95ee1dea0f5e621aba

Nick
10.06.2018
14:52:28
собственно проблема что у вас под docParsedSuccessfully=true попадает очень много доков, и монга собственно их все прочитывает

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

Dmitry
10.06.2018
14:53:50
просто на данном этапе мне реально нужно получить почти все документы из базы...

но почему если убрать этот флаг монга быстрее работает?

Nick
10.06.2018
14:54:27
чтото не заметно, из 2кк вас интересует лишь 10к

Dmitry
10.06.2018
14:54:42
если я просто делаю запрос который внутри "$or" отрабатывается раз в 10 быстрее

Nick
10.06.2018
14:55:02
а вополните второй запрос котоырй "быстрее" с эксплейном

и так же в гист

Dmitry
10.06.2018
14:57:26
черт, я убрал индекс и использовал partial для теста, сейчас добавлю и проверю...

это не касается предыдущего результата, просто я добавить partial для docParsedSuccessfully=true, если его убрать из запроса идет COLLSCAN

Nick
10.06.2018
15:01:44
походу тут полюбому лажа, т.к. $expr не умеет использовать индексы и нет возможности ограничить предварительно выборку, то проблемы не избежать

если это реально критично, то стоит пересмотреть структуру данных и добавлять флаг

а то что без второго условия отрабатывает быстрее, то это именно поулчение 10к доков или время до того как монга чтото ответит и выдаст курсор?

Dmitry
10.06.2018
15:04:09
а то что без второго условия отрабатывает быстрее, то это именно поулчение 10к доков или время до того как монга чтото ответит и выдаст курсор?
до получения курсора, но я сейчас тестирую и что-то тоже туго, возможно я что-то напутал, тестировал еще утром

мда, печалька

Nick
10.06.2018
15:06:02
я уверен что запрос без docParsedSuccessfully у вас просто возвращает курсор с частью данных, а полная выборка до момента, когда все прочтете из курсора будет сопоставима по времени как и с флагом

кстати

Google
Nick
10.06.2018
15:06:23
у вас в первом плане запроса пишет "nReturned" : 9480,

типа только чтолько доков найдено в результате

Dmitry
10.06.2018
15:06:39
а можно как-то использовать bucket или что-то такое чтобы разбить базу на куски и по кусочкам разбирать? В принципе мне так и так нужно на 1 запрос не больше 10к доков

Nick
10.06.2018
15:07:44
собственно если вы укажите например не 10к а 9к, то должно быть быстрее

точнее первыая выбокра будет быстрее, а вторая как и сейчас

Dmitry
10.06.2018
15:08:17
просто limit?

Nick
10.06.2018
15:08:30
да, попробуйте для эксперимента

Dmitry
10.06.2018
15:09:02
а если обрезать скажем по docID (Int) - может ускорить? Скажем 0 <= docID <= 40000 и потом уже expr

ну и потом брать [40000, 80000], [80000, 120000]....

Nick
10.06.2018
15:10:07
а можно как-то использовать bucket или что-то такое чтобы разбить базу на куски и по кусочкам разбирать? В принципе мне так и так нужно на 1 запрос не больше 10к доков
по сути перед тем как группировать на бакеты выполняется какойто матчинг, а уже дальше идет группировка. так что само время выборки будет такое же, но в результате да поулчите наборы по 10к

про диапазоны не скажу, надо в доки лезть про группировке

Dmitry
10.06.2018
15:10:41
ок, спс

пойду фигачить :)

про диапазоны не скажу, надо в доки лезть про группировке
я вообще думаю не про aggregation pipeline, а просто делать find в котором одно из условий - 0 <= docID <= 40000 и потом уже expr через and

Nick
10.06.2018
15:12:22
реальное ускорение кстати сможете получить, если добавите услвоие для docDownloadDate, например работаем с доками загруженными не раньше неделю назад

и если у вас не много дкоов обновляется (порядка как раз 10к из обещго объема в 2кк) то будет прирост

Dmitry
10.06.2018
15:13:40
в общем главное - сузить воронку перед expr?

Nick
10.06.2018
15:14:17
именно

Dmitry
10.06.2018
15:14:44
понял, большое спасибо за помощь

Google
Nick
10.06.2018
15:24:03
?мастабирвоание - пока данные, перенос - пока данные, распределённость, вообще не существует
а разве то что редис персистит нельзя перенести? если что я его не щупал, чет слышал

Peter
12.06.2018
07:35:55
Вопрос, когда делаю insert в базу(js Mongodb Driver), нужно сделать auto increment поля, как это можно реализовать? Знаю при update можно $inc, но мне нужно при insert

И ещё вопрос, есть ли способ в агрегатке string в objectId перевести? Для lookup

Artem
12.06.2018
12:17:42
Камрады, сегодня с 19.00 до 21.00 организуем стрим посвященный шардингу, попытаемся разобрать вопросы по выбору ключей, борьбе с монотонностью и если успеем, поднимем кластер на тестовой среде. https://youtu.be/JH3Pusw1aZg

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