Andrey
как мне найти все письма, где встречаются получатели с доменным именем, отличным от mail.ru ? оператор not {recipients: {$not: /mail.ru/}} не подходит, т.к. в данном примере mail.ru всё таки присутствует
Выделять домен отправителя. В документ писать два поля, домен, пользователь. Индекс построить по 2 полям. Для единообразного выделения использовать tld библиотеки(го и питоне так и искать) или максимально наивно по “@“.
Kvhqm
С точки зрения производительности, чтобы проверить не пуста ли коллекция, лучше использовать count или findOne?
Ты ведь в любом случае делаешь запрос на получение дока, и тебе вернётся результат либо с пустым ответом, либо результат
Kvhqm
Count возвращает сам документ? Точно?
Нет, каунт вернёт нумбер
Kvhqm
Я имел ввиду, когда ты делаешь запрос в бд для получения данных, ты ведь все равно делаешь запрос
Kvhqm
Т.е. что ты этим хочешь оптимизировать?
Andrey
Фраза - делаешь запрос на получения документа - может смущать.
Kvhqm
А если док есть, ты делаешь 2 запроса...
Andrey
Это супер микро оптимизация, разве нет?
Я вообще плохо понимаю кейсы, где надо проверять коллекцию на пустоту и еще заботиться о производительности.
Experimentalist
Я вообще плохо понимаю кейсы, где надо проверять коллекцию на пустоту и еще заботиться о производительности.
Если мы делаем findOne, то если есть какой-то результат, то коллекция не пуста. Одну строку получили и успокоились. В случае с count, движок будет проходиться и считать количество, что, наверное, более ресурсозатратно. Вот что я имел ввиду.
Andrey
Если мы делаем findOne, то если есть какой-то результат, то коллекция не пуста. Одну строку получили и успокоились. В случае с count, движок будет проходиться и считать количество, что, наверное, более ресурсозатратно. Вот что я имел ввиду.
Я про другое, что за дизайн и концепт в вашем сервисе, что вам надо знать, пустая коллекция или нет, при том, что еще стоит задумываться о производительность, у вас предполагается +100500 rps на коллекцию без документов, или +-100500 коллекций. Вот это странно.
Andrey
Просто вопрос из интереса.
Вообще - похоже на «экономию на спичках»
Nick
Просто вопрос из интереса.
если просто из интереса, то можно положить документ при создании базы один раз и всегда знать точно что она не пуста
Experimentalist
если просто из интереса, то можно положить документ при создании базы один раз и всегда знать точно что она не пуста
Что лучше с точки зрения производительности, проверять, есть ли документ с уник. ключом перед вставкой, или пытаться вставить значение через try catch?
Nick
Что лучше с точки зрения производительности, проверять, есть ли документ с уник. ключом перед вставкой, или пытаться вставить значение через try catch?
Как обычно без знаний о специфике нельзя однозначно сказать. В общем случае трай кетч всеравно нужен если приложение это не однопоточный скрипт и есть вероятность вставки данных параллельно. Файнд перед вставкой хорош будет если вероятность найти док в бд будет высокая
Alex
Друзья, поделитесь книгой "Mastering MongoDB 6.x" если есть у кого-то
madspectator
Друзья, поделитесь книгой "Mastering MongoDB 6.x" если есть у кого-то
https://ya.ru/search/?text=Mastering+MongoDB+6.x+pdf первая ссылка в яндексе
Experimentalist
в части записи как и любые индексыв
В mongodb, если поле уникально, то нельзя сделать, чтобы было много строчек со значением этого поля null как в MySQL. Может быть только одна строчка с null для unique поля. Верно?
Experimentalist
можно сделать sparse или partial индексы
reIndex — дорогая операция?
Nick
reIndex — дорогая операция?
не понимаю в чем вопрос. Дорогая относительно чего?
Experimentalist
Допустим, поле было null, а стало не null. Это разумно после изменения на не null обновить индексы?
Nick
reIndex — дорогая операция?
и почитайте внимательно доку reindex уже давно депрекейтед и его не рекомендуется использовать
Данила
Всем добрый день. Работаю с mongoDb и nest js. Есть условные таблицы users и posts. При написании кода создания поста мы используем модель поста и создаем новую сущность. Для удобства (в специфичных кейсах) мы хотим добавить после создания поста к юзеру из таблицы users в поле posts ObjectId на новый пост. Есть ли более удобное для этого решение, кроме как использовать модель юзера и обновлять вручную ему его поле через findByIdAndUpdate? Возможно какая-то привязка, чтобы это выполнялось автоматически при создании и удалении сущности (поста в нашем случае)
IDONTSUDO
https://github.com/mongodb-js/mongoose-autopopulate
Данила
https://github.com/mongodb-js/mongoose-autopopulate
Насколько я понял, этот плагин нужен для автоматического populate всех ObjectId полей сущности. Мне же нужно при создании сущности с подвязкой на ObjectId конкретного юзера вставить ObjectId созданной сущности в определенное поле в записи этого юзера
Experimentalist
можно сделать sparse или partial индексы
Сделал индекс в котором поле одновременно sparse + unique = ошибка при вставке — дубликат поля со значением null.
Experimentalist
Сделал индекс в котором поле одновременно sparse + unique = ошибка при вставке — дубликат поля со значением null.
MongoServerError: E11000 duplicate key error collection: gift_app_db.actions index: target_action_id_1 dup key: { target_action_id: null }
Experimentalist
MongoServerError: E11000 duplicate key error collection: gift_app_db.actions index: target_action_id_1 dup key: { target_action_id: null }
gift_app_db> db.actions.getIndexes() [ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { target_action_id: 1 }, name: 'target_action_id_1', unique: true, sparse: true } ]
Experimentalist
Что я не так сделал?
Experimentalist
Что я не так сделал?
Доброе утро, друзья. Кто знает ответ?
Experimentalist
Я кажется понял, я пытался явно полю задать null.
Experimentalist
А должно быть undefined.
Experimentalist
https://stackoverflow.com/questions/24488143/mongodb-set-id-as-decreasing-index
Experimentalist
https://stackoverflow.com/questions/24488143/mongodb-set-id-as-decreasing-index
Почему нельзя задать -1 индекс для id? Иначе как сделать аналог SELECT... DESC из SQL.
Experimentalist
Почему нельзя задать -1 индекс для id? Иначе как сделать аналог SELECT... DESC из SQL.
А то получается, что мы выборку делаем с начала и только потом результат инвертируем.
Experimentalist
А то получается, что мы выборку делаем с начала и только потом результат инвертируем.
Мне нужно выборку сразу делать с конца, т.к. я использую пагинацию skip-offset.
Experimentalist
const latestRecord = await collection.find().sort({ timestamp: -1 }).limit(1).toArray();
Experimentalist
Experimentalist
Т.е. нам предлагают сначала все записи выбрать, затем их отсортировать в обратном порядке и только потом делать limit-skip.
Experimentalist
Оказывается в findOptions метода find был sort.
Experimentalist
Доброе утро, друзья. Как посчитать количество записей, которые идут до _id N. Грубо говоря, посчитать количество записей созданных до записи с _id N.
Experimentalist
const count = await collection.countDocuments({ _id: { $lt: new ObjectId(myId) }, action_type: 1 }); Вот такой запрос посчитает записи у которых экшн тайп = 1 и _id меньше, т.е. записи были созданы раньше, так?
Experimentalist
ты лучше на дату создания смотри
Я не храню её полем, т.к. есть _id
Experimentalist
Я не храню её полем, т.к. есть _id
В _id же дата создания хранится.
Experimentalist
Или неправильно делаю, что не храню?
Anton K.
В _id же дата создания хранится.
удобно наверное каждый раз её туда сюда гонять
Experimentalist
удобно наверное каждый раз её туда сюда гонять
Я не знаю. Если mongo даёт нам новый тип id взамен обычных автоинкрементов, то я стараюсь использовать это.
Experimentalist
Зачем хранить дату отдельным полем, если она хранится в id, и зачем она хранится в id, если ею не пользуются?
Experimentalist
удобно наверное каждый раз её туда сюда гонять
Кто здесь новичок, а кто специалист?
Daniil
Зачем хранить дату отдельным полем, если она хранится в id, и зачем она хранится в id, если ею не пользуются?
дата используется для генерации _id, но не более того как только потребуется реализовать любой запрос завязанный на работу с датами (собственно, как у вас в примере), то становится очевидно зачем нужно отдельное поле или например потребуется изменить дату
Nikita
Кто нибудь играл в vectorSearch? Это правда что в монге это работает исключительно по всей коллекции и нет варианта предварительно отфильтровать?
Askhat
Кто нибудь играл в vectorSearch? Это правда что в монге это работает исключительно по всей коллекции и нет варианта предварительно отфильтровать?
Всегда должен быть первым стейджем. Внутри есть фильтры по своим индексам, чтобы префильтровывать и для этого нужны ещё дополнительные индексы под каждое поле помимо обычных
Askhat
Тоесть это не правда? То что нельзя избежать поиска по всей коллекции в случае vectorSearch?
Можно избежать (https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-stage/#ann-examples, пример Filter Example) Но я бы все таки посоветовал например Weaviate если нужен вектор
Kirilll
Ну так кто подскажет? Или придётся всё же поле "дата" внедрять?
вроде операторы lt/lte/gt/gte можно применять к _id записи в монге, если память не изменяет
Experimentalist
Всё попробовал, не работает.
Амир
Почему?
Artem
Ребята, всем привет! Есть вопрос по планированию запроса и validate коллекции. Есть запрос: {"q":{"cn":"country_name","c_at":{"$lt":{"$date":"2024-11-18T10:21:50.001Z"}}},"limit":0} Есть используемый индекс: IXSCAN { cn: 1, uid: 1 } Кол-во документов, которые он просканил, много: "keysExamined": 145510823, "docsExamined": 145510823 Кол-во фильтраций: "ndeleted": 9648 Из 145 миллионов просмотренных документов удалено только 9648. Это говорит о том, что фильтрация неэффективна. Длительность запроса: "durationMillis": 353256 Окей, делаем новый индекс, более подходящий для нашего запроса: { key: { cn: 1, c_at: 1 }, name: 'cn_1_c_at_1' } Выполняем запрос, получаем тоже самое... "planSummary": "IXSCAN { cn: 1, uid: 1 }" используем не очень эффективный индекс.. Планировщик так решил: "replanned": true, "replanReason": "cached plan was less efficient than expected" Вопрос: может ли помочь просто дроп "неправильного" индекса или потребуется полный validate коллекции? Чтобы планировщик собрал полную и актуальную статистику по коллекции?
Nick
Ребята, всем привет! Есть вопрос по планированию запроса и validate коллекции. Есть запрос: {"q":{"cn":"country_name","c_at":{"$lt":{"$date":"2024-11-18T10:21:50.001Z"}}},"limit":0} Есть используемый индекс: IXSCAN { cn: 1, uid: 1 } Кол-во документов, которые он просканил, много: "keysExamined": 145510823, "docsExamined": 145510823 Кол-во фильтраций: "ndeleted": 9648 Из 145 миллионов просмотренных документов удалено только 9648. Это говорит о том, что фильтрация неэффективна. Длительность запроса: "durationMillis": 353256 Окей, делаем новый индекс, более подходящий для нашего запроса: { key: { cn: 1, c_at: 1 }, name: 'cn_1_c_at_1' } Выполняем запрос, получаем тоже самое... "planSummary": "IXSCAN { cn: 1, uid: 1 }" используем не очень эффективный индекс.. Планировщик так решил: "replanned": true, "replanReason": "cached plan was less efficient than expected" Вопрос: может ли помочь просто дроп "неправильного" индекса или потребуется полный validate коллекции? Чтобы планировщик собрал полную и актуальную статистику по коллекции?
а сколько доков то в итоге подпадает под выборку?
Nick
nReturned: 4555, и на это мы тратим 353с
закиньте сам запрос. без него это инфа бесполезна
Vladimir
Здравствуйте. Хотел задать вопрос по поводу параллелизации. Есть удаленная коллекция базы mongodb. Она пусть будет 100 гигов. Вопрос в чем, хочется на pymongo сделать 5 потоков например, чтобы в каждом потоке скачивать данные параллельно. Посмотреть изменится ли скорость загрузки всей базы при этом. Но возникает вопрос здесь, как бы коллекцию разделять по умолчанию на 5 частей, чтобы каждый поток скачивал только свою часть. Так как хочется универсальное решение, то хотелось бы на основе генерируемого поля id. Есть ли какие нибудь функции, фильтры, которые бы позволяли это делать ? К примеру, как по функции mod(5) к числу bigint. Но только применительно к mongodb. Спасибо.
Vladimir
Ну хотелось какое то универсальное средство для разовой перекачки и для инкрементной. Просто если база например большая, то хочется максимально ускорить процесс переливки для случаев когда или сама база большая, или инкремент большой. Просто есть задача переливок из mongo в реляционки, а там каждая секунда на счету , чтобы в общий etl все наставлять. И именно на основе id, потому что оно всегда есть, а timestamp или какой другой идентификатор в каждой коллекции от случая к случаю