Тим
да как в алиэкспесе выбрал валюту он показывает все в твоей валюте
Sergey
Создай index и в options не помню какой параметр надо прокинуть, но можно сделать, что ошибку выбрасывать не будет, а просто пропустит
Так никакой ошибки и не вылетает) Он проходится сверху и заменяет булевые значения на те, что есть в json. Это проблема для уже обработанных документов, если оним уже обработаны дальше по коду, не нужно их обновлять в рамках insertMany :)
Dmitry
ребят кто с курсом валют работал? у меня магазин там надо в разных валютах показывать вот думаю в комой момент конвертировать цену, при добавлении нового товара или когда при запросе товаров(это затратно по времени мне кажется)
Лично сам сделал, что в бд храниться эталонное значение и уже от него считаются остальные валюты. Саму конвертацию вынес бы за пределы бд т.к. это уже не их зона отвественности. Мб в качестве оптимизации, добавил кэширование, чтобы лишний раз в бд не лезть и не считать цену
Alexandrr
курсы брать можно на фронте используя публичное апи, конвертацию тоже там
Тим
я понял так цена одна в базе, потом при запросе товаров я отдаю по пагинации 20 штук на клиент а там после идет запрос апи на валюту(курс) прохожусь по массиву подставляю нужную валюту и выдаю, так?
Тим
спасибо думаю так и сервер напрягаться не будет
yopp
ребят кто с курсом валют работал? у меня магазин там надо в разных валютах показывать вот думаю в комой момент конвертировать цену, при добавлении нового товара или когда при запросе товаров(это затратно по времени мне кажется)
Думаю что корректнее всего с финансовой точки зрения это завести отдельную коллекцию для курсов валют. В эту коллекцию складывать раз в Х времени курсы для поддерживаемых валют и использовать эту коллекцию для отображения курсов
Bogdan
как программа называется?🙃
Тим
Думаю что корректнее всего с финансовой точки зрения это завести отдельную коллекцию для курсов валют. В эту коллекцию складывать раз в Х времени курсы для поддерживаемых валют и использовать эту коллекцию для отображения курсов
так беру курс валют ночью сохраняю а потом при запросе товаров от туда забираю курс отдаю все это дело на клиент а там делаю рекурсию меняю цену на курс выбранной валюты ? или просто делаю умножение цены на валюту
yopp
так беру курс валют ночью сохраняю а потом при запросе товаров от туда забираю курс отдаю все это дело на клиент а там делаю рекурсию меняю цену на курс выбранной валюты ? или просто делаю умножение цены на валюту
Выбирайте то, что больше подходит для ваших задач. Если смена валюты частая операция, то имеет смысл делать это на фронте, если редкая, можно сразу на бэкенде
ㅤ
че так сильно жрет(
Nick
че так сильно жрет(
тут вообще ничего не жрется
ㅤ
так и должно быть?
Nick
всегото
Nick
когда своп начнет жрать, тогда это уже будет хоть какойто проблемой
Nick
от нехватки оперативы
ㅤ
спасибо если так и должно быть, то докуплю мемори
ㅤ
а я еще почитал, что оно освобождает автоматически
Nick
на это лучше не расчитывать
Alexandrr
подскажите, что-то я запамятовал уже: .explain() где именно находится флаг "если использовался индекс, то"? .explain() использую после .find({'my_index.index': 'searched_string'}) нашёл в доке только: explain.queryPlanner.indexFilterSet, проблема в том, что отдаёт False = индекс не используется? но почему? (https://www.mongodb.com/docs/manual/reference/explain-results/) если: .list_indexes() возвращает индекс нужный, он существует и успешно создан. в чём ошибка?
Alexandrr
Там explain кидает все варианты, которым он пользовался и конечно же выигрышный
я так понимаю, если indexName = not None, тогда значит индекс использовался?
Nick
я так понимаю, если indexName = not None, тогда значит индекс использовался?
да, IXSCAN - выборка по индексу и думаю там имя всегда будет
Alexandrr
благодарю за подсказки ребят👍
Alexandrr
тогда другой вопрос... в такой структуре документа (см. скрин) пытаюсь создать индексы для: .create_index([('zh.main_title', 'text')]) .create_index([('es.main_title', 'text')]) .create_index([('en.main_title', 'text')]) .create_index([('ru.main_title', 'text')]) пишет, что такой индекс уже существует. получается, не важно для какого "main key" я создаю индекс, если поля у них одинаковые, то индекс будет распространяться на все вложенные ключи в документ? или придётся переназвать ключи, например: "zh.main_title_zh"?
Alexandrr
странный синтаксис, это компаунд индекс по двум полям?
нет нет, обычный синтаксис, просто так pymongo для python либа хавает, там обрати внимание на названия полей п.с. 'text' это для указания, что индекс текстовый
yopp
тогда другой вопрос... в такой структуре документа (см. скрин) пытаюсь создать индексы для: .create_index([('zh.main_title', 'text')]) .create_index([('es.main_title', 'text')]) .create_index([('en.main_title', 'text')]) .create_index([('ru.main_title', 'text')]) пишет, что такой индекс уже существует. получается, не важно для какого "main key" я создаю индекс, если поля у них одинаковые, то индекс будет распространяться на все вложенные ключи в документ? или придётся переназвать ключи, например: "zh.main_title_zh"?
в коллекции может быть только один text индекс, но в нём может быть несколько полей, в вашем случае более подходящяя схема это main_title: [{lang: "zh", value: "foobar"}, ...] Индекс { "main_title.lang": 1, "main_title.value": "text" } Если кроме main_title нужен поиск по другим полям, то properties: [{lang: "zh", type: "main_title", value: "foobar"}, ...] Индекс { "properties.type": 1, "properties.lang": 1, "main_title.value": "text" }
Nick
собсна уже написали, добавлю ссылку https://www.mongodb.com/docs/manual/core/index-text/#wildcard-text-indexes
yopp
У wildcard есть большой минус: нельзя ограничить по другим параметрам, т.е поиск будет всегда по всем значениям, это не оптимальная схема
Nick
а почему бы просто не сделать поле lang и в нем указывать? зачем вложенная структура
Alexandrr
а почему бы просто не сделать поле lang и в нем указывать? зачем вложенная структура
что бы не плодить объекты публикаций, а содержать в 1 объекте переводы или я не понял?
yopp
получается, придётся делать по 1 коллекции для каждого языка?
наиболее оптимально сделать вложенный документ, по примеру как выше
yopp
это позволит без проблем добавлять языки, делать поиск сразу по всем языкам, а если брать второй вариант, то ещё и по разным "полям"
yopp
плюс за счёт того что это compound index, вы сможете эффективно фильтровать языки или поля
yopp
https://www.mongodb.com/docs/manual/tutorial/limit-number-of-items-scanned-for-text-search/
Alexandrr
понял, попробую, благодарю за подсказки и потраченное время!
Alexandrr
https://pymongo.readthedocs.io/en/stable/api/pymongo/collection.html#pymongo.collection.Collection.create_index нашёл тут решение, мб кому пригодится для pymongo, синтаксис создания составного индекса там и опциональность расписана (допустимые аргументы функции) п.с. заебался с этими лишними скобками)) на туториалах в доке монги смотрю - всё просто, а тут дополнительно оборачивать в вызовы "()" и array "[]"
Anton
Всем привет, можно ли как-то пронумеровать документы в агрегагации?
Viktar
Всем привет, можно ли как-то пронумеровать документы в агрегагации?
Посмотрите $setWindowFields https://www.mongodb.com/docs/manual/reference/operator/aggregation/setWindowFields/
Viktar
Господа подскажите можно ли преобразовать колекцию вида { "firstName": "valueF", "lastName": "valueL" } в колекцию { "_id": { "fullName": "$fistName" + "lastName", "page": 1 }, "persons": [array] }, { "_id": { "fullName": "$fistName" + "lastName", "page": 2 }, "persons": [array] } цель сделать статичный пейджинг в массиве persons должно быть 20 элементов Поскольку документов в изначальной колекции около миллиарда, стандарные средства пейджинга работают довольно медленно
Viktar
а что мешает? это же группировка и вывод результатов в таблицу через $out
если групировать по "$fistName" + "lastName", для некоторых документов превышает 16Мб
Nick
если групировать по "$fistName" + "lastName", для некоторых документов превышает 16Мб
тогда скриптами с проходом по всем данным, всеравно такую логику надо в код выносить для обновления
Viktar
я смотрю в сторону $bucket и $bucketAuto. Но пока не получается сделать бакеты по 20 записей в массиве
Nick
тогда скриптом разово, не пытайтесь запрос написать
Viktar
тогда скриптом разово, не пытайтесь запрос написать
наверное так и сделаю. но агрегацией было бы элегантное решение
Nick
ну если получится элегантно, то будет шикарно, по сути надо только пронумеровать данные в каждой группе без использования группировок, что кажется сейчас не очень выполнимым
Viktar
я пока не придумал как разбить их по 20 записей(
Nick
я пока не придумал как разбить их по 20 записей(
делим на 20 целочисленно и поулчаем page
Viktar
))) ну да. Что то я о таком простом решении и не подумал) спасибо
O.
Всем привет! Подскажите 1 момент Есть Foreign Pipeline: { $lookup: { from: 'COLLECTION', let: { userId: '$userId' }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ['$userId', '$$userId'] }, { $gte: ['$createdAt', DATE_START] }, { $lte: ['$createdAt', DATE_END] } ] } } }, { $limit: 1 } ], as: 'collection' } }, Вопрос В коллекции COLLECTION достаточно индекса userId: 1, createdAt: 1 ? Проблема в том, что мы на версии 4.4 В explain не показан результат по индексам в lookup
O.
Я понимаю, что в pipeline на версии 4.4 не работают индексы Вопрос в том, считается ли индекс userId: 1, createdAt: 1 корректным для данного запроса Версии 5.0 пока очень не хватает(
O.
Да именно такой индекс и нужен
Спасибо! Вызывало сомнения И отсутствие данных в explain по $lookup вынуждает перепроверять))
Andrej
Всем привет! Столкнулся с монго, язык Python (словарь имеет свойство упорядоченности ключей), при передачи в монго (update_one + $SetOnInsert ) порядок ключей меняется, при этом всегда одинаков, упорядочен по алфавиту, кроме одного поля user_id, оно почему-то первым идет (в словаре так же первым). Есть ли способы влиять на порядок? Очень неудобно через клиента с gui просматривать записи.
Andrej
Читал, что порядок меняться может при изменениях в доке, но хотя бы первоначально иметь нужный порядок было бы очень удобно.
Andrej
а в чём проблема сделать sorted() после транзакции к СУБД? в чём проблема использовать lambda?
Данные смотрю через клиента монги, вроде компас называется,, не понимаю, где поможет питоновская сортировка.
Andrej
> после завершения транзакции
Не могу уловить мысль. Update_one --> данные ушли в монго. Атомарная операция, где сортед делать?)
Alexandrr
Не могу уловить мысль. Update_one --> данные ушли в монго. Атомарная операция, где сортед делать?)
зачем иметь одинаковый последовательный порядок ключей на одном уровне? если от этого модель данных не изменяется
Alexandrr
это проблема питона или его драйвера, что он так упорядочивает при перед сохранением. Вам остается только почитать доки по ним и попробовать найти способ сохранить порядок (скорее всего надо не использовать словари)
словари питона по дефолту не делают сортировки, последовательность ключей сохраняется согласно последовательности добавления их в модель данных исключение - асинхронные операции, там порядок добавления ключей по понятным причинам может быть непоследовательным