Alexander
что на выходе поулчается?
пока просто последовательность дат. что делать дальше, не дотумкал)
Alexander
Alexander
на скрине не отсортированы, но это поправимо
Nick
"Коля" "01.05" "работал" "Коля" "02.05" "не работал" "Коля" "03.05" "не работал" "Коля" "05.05" "не работал" "Коля" "06.05" "работал" "Коля" "07.05" "работал" "Коля" "08.05" "не работал" "Коля" "09.05" "работал" "Коля" "10.05" "не работал" "Коля" "11.05" "не работал" "Коля" "12.05" "не работал" На выходе: "Коля" "не работал" "02.05" - "05.05" "Коля" "не работал" "08.05" - "08.05" "Коля" "не работал" "10.05" - "12.05" ну или около того
ну и срань же получилась: db.getCollection('aggra_sequence').aggregate([ {$group:{ _id: "$user", as_array: { $push: { date: "$date", status: "$status"} } }}, { $addFields:{ tmp: { $reduce:{ input: "$as_array", initialValue: { date : "", status: "", ranges:[]}, in: { date: "$$this.date", status: "$$this.status", ranges: {$cond: { if: {$eq: ["$$this.status", "$$value.status" ]}, then: {$concatArrays: [ {$slice: ["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1] }]}, [{$let:{ vars: {last: {$arrayElemAt:["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1]}]}}, in: {minDate:"$$last.minDate", maxDate: "$$this.date", status: "$$last.status"} }}] ]}, else: {$concatArrays: [ "$$value.ranges", [{minDate:"$$this.date", maxDate: "$$this.date", status: "$$this.status"}] ]} }} } }} }}, ]) на входе были тестовые вида { "_id" : ObjectId("6297908b47213c19009579aa"), "user" : 1, "date" : "2022-05-01", "status" : "work" } результат: "tmp" : { "date" : "2022-05-09", "status" : "work", "ranges" : [ { "minDate" : "2022-05-01", "maxDate" : "2022-05-01", "status" : "work" }, { "minDate" : "2022-05-02", "maxDate" : "2022-05-05", "status" : "not work" }, { "minDate" : "2022-05-06", "maxDate" : "2022-05-06", "status" : "work" }, { "minDate" : "2022-05-07", "maxDate" : "2022-05-07", "status" : "not work" }, { "minDate" : "2022-05-09", "maxDate" : "2022-05-09", "status" : "work" } ] }
Alexander
ну и срань же получилась: db.getCollection('aggra_sequence').aggregate([ {$group:{ _id: "$user", as_array: { $push: { date: "$date", status: "$status"} } }}, { $addFields:{ tmp: { $reduce:{ input: "$as_array", initialValue: { date : "", status: "", ranges:[]}, in: { date: "$$this.date", status: "$$this.status", ranges: {$cond: { if: {$eq: ["$$this.status", "$$value.status" ]}, then: {$concatArrays: [ {$slice: ["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1] }]}, [{$let:{ vars: {last: {$arrayElemAt:["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1]}]}}, in: {minDate:"$$last.minDate", maxDate: "$$this.date", status: "$$last.status"} }}] ]}, else: {$concatArrays: [ "$$value.ranges", [{minDate:"$$this.date", maxDate: "$$this.date", status: "$$this.status"}] ]} }} } }} }}, ]) на входе были тестовые вида { "_id" : ObjectId("6297908b47213c19009579aa"), "user" : 1, "date" : "2022-05-01", "status" : "work" } результат: "tmp" : { "date" : "2022-05-09", "status" : "work", "ranges" : [ { "minDate" : "2022-05-01", "maxDate" : "2022-05-01", "status" : "work" }, { "minDate" : "2022-05-02", "maxDate" : "2022-05-05", "status" : "not work" }, { "minDate" : "2022-05-06", "maxDate" : "2022-05-06", "status" : "work" }, { "minDate" : "2022-05-07", "maxDate" : "2022-05-07", "status" : "not work" }, { "minDate" : "2022-05-09", "maxDate" : "2022-05-09", "status" : "work" } ] }
Ух моща, спасибо
Alexander
Пойду курить
Nick
ну и срань же получилась: db.getCollection('aggra_sequence').aggregate([ {$group:{ _id: "$user", as_array: { $push: { date: "$date", status: "$status"} } }}, { $addFields:{ tmp: { $reduce:{ input: "$as_array", initialValue: { date : "", status: "", ranges:[]}, in: { date: "$$this.date", status: "$$this.status", ranges: {$cond: { if: {$eq: ["$$this.status", "$$value.status" ]}, then: {$concatArrays: [ {$slice: ["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1] }]}, [{$let:{ vars: {last: {$arrayElemAt:["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1]}]}}, in: {minDate:"$$last.minDate", maxDate: "$$this.date", status: "$$last.status"} }}] ]}, else: {$concatArrays: [ "$$value.ranges", [{minDate:"$$this.date", maxDate: "$$this.date", status: "$$this.status"}] ]} }} } }} }}, ]) на входе были тестовые вида { "_id" : ObjectId("6297908b47213c19009579aa"), "user" : 1, "date" : "2022-05-01", "status" : "work" } результат: "tmp" : { "date" : "2022-05-09", "status" : "work", "ranges" : [ { "minDate" : "2022-05-01", "maxDate" : "2022-05-01", "status" : "work" }, { "minDate" : "2022-05-02", "maxDate" : "2022-05-05", "status" : "not work" }, { "minDate" : "2022-05-06", "maxDate" : "2022-05-06", "status" : "work" }, { "minDate" : "2022-05-07", "maxDate" : "2022-05-07", "status" : "not work" }, { "minDate" : "2022-05-09", "maxDate" : "2022-05-09", "status" : "work" } ] }
общий смысл - используем $reduce над массивом, т.к. он может прихранивать состояние к которому на следующей итерации можно обратиться. Дальше берем массив и кладем в него структуру когда у нас поменялся статус. В последнем элементе массива обновляем maxDate пока не сменится статус и не добавится новый последний элемент
Nick
date кстати лишний внутри реьюса, но не суть
Alexander
Nick
пока чего-то не взлетело ;(
в монгошеле работает, в языках надо все в кавычки оборачивать
Alexander
в монгошеле работает, в языках надо все в кавычки оборачивать
а это в компасе агрегейшн пайплайн, вроде тоже не надо. Первый этап группировки работает, а вот второй чего-то артачиться, не могу пока понять что его не устраиваетс
Nick
с компасом не подскажу
Alexander
с компасом не подскажу
ок, спасибо в любом случае! сильно помог, логику я понял
Alexander
в шеле завёл)
Nick
с шелом проще)
Alexander
с шелом проще)
возможно, но я окошечник со стажем) к командным строкам только привыкаю
~timur~
правильным ли будет использовать экземпляр подключение pymongo (или motor) как глобальную переменную один раз в коде или для большого проекта нужно как-то подругому?
Alexander
например, как это рекомендуют делать в проектах на пайтоне
~timur~
спасибо
winterfall
да, правильным будет открытие одного клиента, а после обращение только через него
Поддерживаю, mongoose к примеру по умолчанию делает один клиент, и при множественном импортировании клиент не пересоздаёт
Cloud
да, правильным будет открытие одного клиента, а после обращение только через него
а чем это правильно? допустим нативный дравер монги для ноды поддерживает много коннектов
winterfall
а чем это правильно? допустим нативный дравер монги для ноды поддерживает много коннектов
Ну так поддерживает - это одно, а оптимизация - это другое. Монгуз тоже несколько коннектов поддерживает)
Cloud
конфликты возможны
Ну допустим, у меня щас драйвер 3.7.3, выше поставить не могу из-за версии ноды вот такая функция вызывается внутри джоб, которых дохрена есть некое неадекватное поведение со стороны хоста монги, джобы обрабатываются, происходит апсерт, все ок, проц загружен на половину внезапно проц на 100% начинает грузиться, и перестает запросы принимать
Cloud
возможно эти 2 факта связаны, но как инициализировать коннект заранее, чтобы потом можно было его именно заэкпортить, а не передать параметром
FARRUKH
всем привет, кто нибудь сталкивался с авторизацией в mongodb через AD? как его настраивать?
Вадим
Всем салют, может кто поможет советом или направлением куда копать, вот в каком вопросе... Проблема такая, есть сервис на go, запускается скажем в 10 потоков (может сильно больше). Каждый сервис обрабатывает файл, и нужные данные из него собирает в документ, а дальше документ вставляет в коллекцию в mongoDB. У документов есть номер и версия, и перед тем как вставить в монгу, делается запрос по номеру документа. Если документа нет - идет вставка. Если есть - сравниваются версии, если у нового документа версия больше, чем у документа в монге - документ в монге заменяется новым документом (с большей версией). Но из-за параллельной работы сервисов получается так, что например в нескольких работающих сервисах, одновременно обрабатывается документ с одним и тем же номером, но разными версиями. И при поиске (запрос в монгу) все сервисы получают, что документа с таким номером нет, и все 3 сервиса добавляют один и тот же документ но с разной версией. пробовал на mongo 4.0, 4.2, 5 Пробовал replaceOne Индекс есть на номер документа Пробовал транзакции, не спасают, с разницей от 1 до 150 мс вижу в дате создания документа в коллекции. Вот собственно вопрос, что можно еще сделать/попробовать чтоб не было дублей в монге при многопоточной работе сервисов? может я в поисках своих что-то упустил?
Всем привет, не большой апдейт к моему старому вопросу... - По предложению @wayfar8r: Триггеры решили не использовать - По предложению @yatoba: 1."поставить уникальный индекс на номер"... он и правда был но не на уникальность :/ добавил... В этом случае дублей нет, но после обработки задания - находились документы не самой последней версии. 2."все остальное либо транзакции либо upsert при условии что версия дока в базе меньше" (пробовал без уникального индекса) *транзакции - не помогли (дубли находятся), либо их как-то особым образом надо настраивать по части блокировок (возможно недораскурил) и плюс еще получал ошибку (WriteConflict) Plan executor error during findAndModify :: caused by :: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction. Пробовал с опциями по дефолту и с опциями Majority так: sc.StartTransaction(options.Transaction(). SetReadConcern(readconcern.Majority()). SetWriteConcern(writeconcern.New(writeconcern.WMajority())), ) Подсматривал сюда https://github.com/mongodb/mongo-go-driver/blob/v1.9.1/examples/documentation_examples/examples.go не победил ( *upsert - Тоже дубли (пробовал без уникального индекса) Примерный код был таков: mongo.Client.UseSession(cx, func(sc mongo.SessionContext) error { ... opts := options.Replace().SetUpsert(true) result, err := collection.ReplaceOne(sc, query, obj, opts) ... }) Может еще у кого будут идеи? - И на этом вопросе опять хотел остановится. но решил попробовать все в раз применить: уникальный индекс + транзакция c Majority-опциями + replaceOne с upsert:true => x10 потоков и кажется все получилось, дублей понятно нет, но и неактульных версий с ходу не нашел (долго проверять) Может кто чего дополнит/поправит? :) CLUSTER Mongos EDITION MongoDB 5.0.8 Community Всем откликнувшимся спасибо за советы!
agic
привет
agic
https://stackoverflow.com/questions/17134114/mongo-db-log-disabling
agic
в обще монго каждый коннект пишет в syslog systemLog: quiet: true такой конфиг не помогает, есть более изящные решение чем то что на stackoverflow
agic
db.getLogComponents 0 или -1
Cheusov Alexandr
Всем привет. А кто-то мониторит БД с помощью prometheus+mongodb-exporter?
fenogentov
На убунту 21 как то можно поставить mongo shell версии 3.4?
Александр
Всем привет Только начал изучать монго Подскажите, плиз Как для индекса по полю добавить вес?
Alexander
Всем привет Только начал изучать монго Подскажите, плиз Как для индекса по полю добавить вес?
db.blog.createIndex( { content: "text", keywords: "text", about: "text" }, { weights: { content: 10, keywords: 5 }, name: "TextIndex" } ) https://www.mongodb.com/docs/manual/tutorial/control-results-of-text-search/
Сергей
Ребят, подскажите как лучше хранить id файла У меня есть например паспортные данные Мне нужно где то хранить id фотографии (скана) Вижу 2 варианта 1. В модель добавить дополнительное поле file_id 2. Сделать отдельную модель с enum к чему относится файл Проблема 1 варианта в том, что мне не всегда нужен id файла, а только данные Получается для каждой модели с подобным расположением idшника понадобится делать дополнительный параметр запроса Со вторым вариантом проще, так как я могу собрать все нужные данные только в том запросе где они нужны Но не удобно, что нужно писать тип. Так же получается на фронт уйдет массив, понадобится доп логика для распределения значений. Либо подобную логику делать на беке, либо забить😅 Как стоит сделать?
Сергей
dnacd 🦜
Ты отдашь только то, что тебе нужно. А не целый документ
dnacd 🦜
Что имеешь в виду?
Результат скана и пасспорт это одна сущность, отдавать или не отдавать айди документа это твой выбор, ты можешь вернуть документ без айдишника
Вадим
Всем привет, может тут кто-то подскажет можно ли как-то кастомизировать модель документа в зависимости от того, обновление идет или вставка при ReplaceOne с указанием upsert true?
Вадим
$setOnInsert
Класс!! Спасибо!!!
Tagir
Lestat
админ привет! у вас тут в чатике сидит разводилка на деньги @Rita12z предлагаю заблокировать, чтобы не драконила участников
Lestat
Lestat
она у меня 100$ просит
Lestat
говорит прибыль не кислая))
dnacd 🦜
та там от одного био надо банить нахуй
Dmitriy
говорит прибыль не кислая))
Лес ты уже попробовал или как? :)
Lestat
Лес ты уже попробовал или как? :)
вот думаю стоит ли верить Рите из Нидерландов или вложить 100$ во что-то другое Голландское ;)
Dmitriy
dnacd 🦜
вот думаю стоит ли верить Рите из Нидерландов или вложить 100$ во что-то другое Голландское ;)
за 100 бачей чего-то другого голандского можно неделю триповать
dnacd 🦜
поэтому выбор очевиден
🅰️nimeCoder
Ilya
без предоплаты но с 20к рублей?
Vladimir
Oleh Kopyl
У меня взломали базу данных. Файлы на месте, но не могу сделать экспорт. Как такое вообще возможно?
Oleh Kopyl
И как сделать бекап? Делаю mongodump -u "USERNAME" -p "PASSWORD" --authenticationDatabase admin, ругается: 2022-06-04T17:58:15.511+0300 WARNING: On some systems, a password provided directly using --password may be visible to system status programs such as `ps` that may be invoked by other users. Consider omitting the password to provide it via stdin, or using the --config option to specify a configuration file with the password. 2022-06-04T17:58:15.537+0300 Failed: error creating intents to dump: error creating intents for database config: error getting collections for database `config`: (Unauthorized) not authorized on config to execute command { listCollections: 1, filter: {}, lsid: { id: UUID("3d4eb059-544f-402f-abf8-679f67d394ba") }, $db: "config" }
Oleh Kopyl
Но все равно нужно понять как кто-то мог получить доступ к моей базе данных... И почему не получалось сделать бекап используя --authenticationDatabase, но получалось войти в базу данных...
🅰️nimeCoder
ща бы бд без авторизации шарить, ее уже минут через 30 хакрут прогнав сканером ipv4
🅰️nimeCoder
причем в автоматическом режиме хочу заметить)
🅰️nimeCoder
сам то без авторизации через компас войти можешь? учетные данные нормальные?
Nikita
Приветствую господа, интересует сталкивался кто либо и как разрешил вопрос, используя компас делаю импорт к документа, проверил исходный json файлик все сохранилось правильно, импортирую на удаленный сервер, получается что пропадают несколько данных, почему так, заранее спасибо
Nikita
Nikita
Nikita
Nikita
Сайт лежит, кто знает что там у них?
~timur~
Сайт лежит, кто знает что там у них?
для россии доступ закрыли