yopp
На мой взгляд пройти через initial sync таких случаях выгоднее, так как вы за одно проверите хватает ли у вас емкости кластера чтоб его завершить и плюс вернёте файловой системе неиспользованное пространство, если такое накопилось.
Vitaly
Парни, а есть разница по перфомансу между монго апи и aggregation api? Ну т.е например я .find({a,1}) и .aggregate([{"$match":{a,1}}]) запускаю, оно по-разному работать будет?
Vitaly
а +\- от чего зависит?
Vitaly
там один и тот же движок под капотом?
yopp
курсор один и тот-же
yopp
а вот пайплайны и простые запросы работают по разному
yopp
плюс для AF есть свой набор оптимизаций, который зависит от пайплайна
Vitaly
дело в том, что c# драйвер умеет в нативное апи и еще в LINQ(c# sql-like синтаксис), который транслируется всегда в AF, вот интересно стало какой оверхед будет, если linq с монгой использовать
yopp
Vitaly
Сарказм, да?
yopp
нет, наклейка которую монговцы раздают на конференциях
Vitaly
Ничеси. Т.е. в перспективе find спилят?
yopp
сомневаюсь. но идея заключается в том, что для сложных выборок AF удобнее. эта фоточка всплыла когда я Асю Камски спрашивал почему так сложно фильтровать массивы через find и так просто через AF на что я получил эту фоточку :)
yopp
наклейку не получил(
Vitaly
Обидно
Vitaly
Но идею с AF vs find понял
Vitaly
Благодарю
Sergey
ребят подскажите пожалуйста, у меня есть коллекция, в ней текстовое поле в которой содержаться url c get параметрами, как мне обрезать эти get параметры и вывести без них в выборке?
Ilya
я бы посмотрел на split https://docs.mongodb.com/manual/reference/operator/aggregation/split/ и по знаку "?" который отделяет гет параметры разделял строку
Ilya
но я в агрегациях не спец
Ilya
Подскажите пожалуйста, какой readconcern поставить, если в транзакции необходимы только 2 acid требования: атомарность и долговечность?
yopp
если нужны durable reads, то majority
yopp
в обратном случае можно прочитать то, что потом откатится при выборах
Ilya
понял, спасибо, попробую
Matvey
Привет, подскажите пожалуйста, использую pymongo для python для подключения БД. Как с помощью синтаксиса mongo можно найти запись по id и прибавить к одному из полей значение переданное как аргумент? целочисленное значение. Просто мне в голову пришло только получить документ, отредактировать и обновить его. Но мне кажется, что есть решение лучше
Oleg
Доброго времени суток. Вопрос к опытным пользователям mongodb aggregation framework. Используя MotorAsyncIO, пробую одним запросом к базе получить сразу итератор из найденных документов, а также общее количество найденных документов. Вот примерно как делаю ( https://stackoverflow.com/questions/21803290/get-a-count-of-total-documents-with-mongodb-when-using-limit ): db.collection.aggregate([ { "$facet": { "data": [ { "$match": query}, { "$skip": skip}, { "$limit": limit} ], "meta": [ { "$count": "total"} ] }} ]) Оно работает так: возвращает курсор - асинхронный генератор с одним элементом. Если по этому курсору проитерироваться 1 раз, получим dict (hashmap) в котором будет два индекса - data и meta. Вопрос: можно ли как-то при первом запросе к базе вернуть не генератор, а dict? Либо курсор-итератор из найденных документов с возможностью как-то достать из курсора total.
yopp
Доброго времени суток. Вопрос к опытным пользователям mongodb aggregation framework. Используя MotorAsyncIO, пробую одним запросом к базе получить сразу итератор из найденных документов, а также общее количество найденных документов. Вот примерно как делаю ( https://stackoverflow.com/questions/21803290/get-a-count-of-total-documents-with-mongodb-when-using-limit ): db.collection.aggregate([ { "$facet": { "data": [ { "$match": query}, { "$skip": skip}, { "$limit": limit} ], "meta": [ { "$count": "total"} ] }} ]) Оно работает так: возвращает курсор - асинхронный генератор с одним элементом. Если по этому курсору проитерироваться 1 раз, получим dict (hashmap) в котором будет два индекса - data и meta. Вопрос: можно ли как-то при первом запросе к базе вернуть не генератор, а dict? Либо курсор-итератор из найденных документов с возможностью как-то достать из курсора total.
«Если по этому курсору проитерироваться 1 раз, получим dict (hashmap) в котором будет два индекса - data и meta.» это именно то, как работает курсор — вы по нему итерируетесь и получаете результаты запроса. в вашем случае из-за $facet у вас будет один документ с двумя ключами data и meta
yopp
а вы что хотите?
Oleg
а вы что хотите?
Мне бы в идеале курсор с документами сразу, без лишней цепочки. А инфу о total как-то рядом.. либо в курсоре, либо как-то еще..
yopp
вы не можете получить результат без курсора
yopp
курсор это и есть абстракция над результатами
yopp
$facet работает таким образом что он все измерения собирает в один результат
Oleg
Понятно.. Если мы знаем, что результат один, то не стоит возвращать итерируемый объект, а надо бы вернуть курсор с атрибутами, в котором были бы ссылки на то, что собрал facet. А так это использовать без костылей в коде нельзя
Oleg
Пока буду 2 запроса делать и ждать, когда нормально реализуют..
yopp
не очень понимаю в чём проблема у вас
yopp
нет, нельзя вместо курсора вернуть что-то другое
yopp
а у курсора интерфейс как у итератора, потому что он и есть итератор над результатами
yopp
то что у вас 1 результат это частный случай
yopp
это не отменяет того что курсор остаётся итератором
yopp
и это не бага, это фича и это и есть «нормальная» реализация, другой надеюсь не будет
Oleg
Понятно. Спасибо. Жаль нет что-то типа raw_documents в кусоре
yopp
ваш драйвер может от вас это скрывать в некоторых случаях, но под капотом это всегда так работает
yopp
что такое raw_documents?
yopp
весь смысл $facet чтоб собрать несколько курсоров в один результат
yopp
если вы хотите два разных курсора, то вам нужно сделать два запроса
Oleg
что такое raw_documents?
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-rowcount.html что-то типа такого
yopp
вы наверное не понимаете зачем нужен $facet
Oleg
Хотелось бы понимание по чему итерируемся, сколько там записей. Я сейчас делаю два запроса: сначала делаю count_documents, потом извлекаю.
yopp
тогда вы от него хотитет того, что вступает в логическое противоречие с тем зачем он придуман
Oleg
Я facet не использую в данном случае, так как оно работает не совсем так, как хотелось бы. Я спрашиваю: как сделать и показыавю, что я хотел бы получить. Я не говорю, что я делаю правильно
yopp
вы привели пример с агрегацией с $facet и сказали что вы хотите получить доступ к курсору из которого собраны результаты в атрибуте data, я вас правильно понял?
Oleg
вы привели пример с агрегацией с $facet и сказали что вы хотите получить доступ к курсору из которого собраны результаты в атрибуте data, я вас правильно понял?
Не совсем. Давайте абстрактно, без facet. Хочу сделать 1 запрос и получить итератор с документами в курсоре и как-то мета информацию о количестве документов.
Oleg
Типа row_count в мускуле
yopp
о количестве документов где?
Oleg
Не знаю.. Курсор - это же объект, он может быть итераторм , а так же содержать атрибуты с информацией
yopp
количество документов попавших в курсор можно получить через count или size
yopp
count покажет без skip/limit, size покажет с учетом skip/limit
yopp
количество документов «не знаю где» получить невозможно
Oleg
['_Cursor__die', 'aiter', 'anext', 'class', 'copy', 'deepcopy', 'delattr', 'delegate_class', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'motor_class_name', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_buffer_size', '_clear_cursor_id', '_close', '_close_exhaust_cursor', '_data', '_each_got_more', '_framework', '_get_more', '_killed', '_query_flags', '_refresh', '_to_list', 'add_option', 'address', 'alive', 'batch_size', 'clone', 'close', 'closed', 'collation', 'collection', 'comment', 'cursor_id', 'delegate', 'distinct', 'each', 'explain', 'fetch_next', 'get_io_loop', 'hint', 'limit', 'max', 'max_await_time_ms', 'max_scan', 'max_time_ms', 'min', 'next_object', 'remove_option', 'rewind', 'session', 'skip', 'sort', 'started', 'to_list', 'where']
yopp
['_Cursor__die', 'aiter', 'anext', 'class', 'copy', 'deepcopy', 'delattr', 'delegate_class', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'motor_class_name', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_buffer_size', '_clear_cursor_id', '_close', '_close_exhaust_cursor', '_data', '_each_got_more', '_framework', '_get_more', '_killed', '_query_flags', '_refresh', '_to_list', 'add_option', 'address', 'alive', 'batch_size', 'clone', 'close', 'closed', 'collation', 'collection', 'comment', 'cursor_id', 'delegate', 'distinct', 'each', 'explain', 'fetch_next', 'get_io_loop', 'hint', 'limit', 'max', 'max_await_time_ms', 'max_scan', 'max_time_ms', 'min', 'next_object', 'remove_option', 'rewind', 'session', 'skip', 'sort', 'started', 'to_list', 'where']
https://api.mongodb.com/python/current/api/pymongo/cursor.html#pymongo.cursor.Cursor.count
Oleg
Это все, что есть в курсоре MotorAsyncIO
yopp
как видите вообще это всё предлагают заменить в пользу count_documents, что очень даже разумно
Oleg
Видимо, буду делать два query.. count_documents и потом уже получать итератор с документами. Спасибо за разъяснение! :)
Nan0
ребят, а есть способ проверки, когда в последний раз бд была обновлена целиком?
Nan0
или просто по совпадению полей документов сравнивать?
Vlad
Добрый день, можно ли как-то граммотно переместить данные из одного массива в другой используя mongoose: Пример схемы { arr1: [ { _id: "5c68eddb8b6a1a258ad99571", name: "Ivan" }, { _id: "5c68eddb8b6a1a258ad99572", name: "Vlad" }, ], arr2: [ ] } Просто может можно ли как-то переместить данные, без лишних телодвижений))
Nick
Понял, буду знать Спасибо большое за ответ ;)
Апдейты в монге не могут опираться на значения из других документов.