Dmitry
Текстовый индекс можно использовать, только на первом этапе
Sultan
Ребят , а что нужно юзнуть , для того что бы при Collection.find() он искал обьект по опр параметрам ... (Node JS) ?
Yury
Текстовый индекс можно использовать, только на первом этапе
Ну а вообще как быть в таком случае? Или в лоб самому проходится по каждому элементу, доставать ID и уже по ним сравнивать?
Yury
Regexp
Смотри, мне параметром приходит строка с буквами, а в документе во многих полях IDшники, которые ссылаются на другие документы в которых есть текстовое поле, по которому и надо искать, поэтому Regex тут не поможет. Наверно нужно по каждому документу проходится и собирать IDшники в массив, если этот документ подходит и потом уже в результирующий документ подставлять.
Yury
Всмысле не поможет? Делаешь свой lookup, а потом match с regexp
ааа теперь понял. Просто у меня еще и пагинация есть, и в таком случае он будет искать не по всей коллекции, а только по отдельной странице(
Dmitry
Sort и limit и иди потихоньку. Если у тебя js/ts и mongoose и ты не знаешь как лучше пагинацию сделать, то там плагин для find и aggregation есть
Dmitry
?
Открыть гугл
Yury
Снова не вижу проблемы
{ $sort: { _id: -1 } }, { $skip: limit * page - limit }, { $limit: limit }, // тут lookup // и уже тут match с regex match и regex уже будут проходиться по выше выбранным элементам
Yury
Sort, Skip и Limit для пагинации, обычно использую в самом конце
получается тогда lookup пойдет отрабатывать по всей коллекции?
Yury
Да
Не слишком ли это будет затратная операция, если там к примеру 15000 элементов?
Alexandrr
Не слишком ли это будет затратная операция, если там к примеру 15000 элементов?
такой же вопрос каждый раз возвращать сначала 0-20, потом 20-40 например, при условии, что под фильтр подходит найденные условные 15к записей
Yury
А еще вопрос такой: как быть с сортировкой если в полях хранятся ссылки на другие элементы? Может не совсем понятно говорю, поэтому вот пример: Главный документ: { _id: "63b3d7c2847c42e2b3cd27c1", phone: "789012354678" ownerId: "63b3d0e4847c42e2b3cca346" } Второй документ: { _id: "63b3d0e4847c42e2b3cca346", owner: "Some Name" } По правильно так и нужно организовывать модели в монге: ссылаться на Id. Но как теперь организовать полнотекстовый поиск и сортировку ? |Номер | Владелец | |——————————————————---------------------—| |789012354678 | Some Name | ...
Dmitry
А еще вопрос такой: как быть с сортировкой если в полях хранятся ссылки на другие элементы? Может не совсем понятно говорю, поэтому вот пример: Главный документ: { _id: "63b3d7c2847c42e2b3cd27c1", phone: "789012354678" ownerId: "63b3d0e4847c42e2b3cca346" } Второй документ: { _id: "63b3d0e4847c42e2b3cca346", owner: "Some Name" } По правильно так и нужно организовывать модели в монге: ссылаться на Id. Но как теперь организовать полнотекстовый поиск и сортировку ? |Номер | Владелец | |——————————————————---------------------—| |789012354678 | Some Name | ...
1. Используешь Aggregation 2. Делаешь Lookup (лучше вариант с piplines использовать т.к. сможешь использовать match, чтобы часть результатов отсеить) 3. Если связь является 1 к 1, то результат лучше вытащить из массива, чтобы дальше было проще работать. 4. Выполняешь match (если он тут ещё необходим) 5. Вызываешь Sort, но тут стоит учесть, что если в сортировке участвует несколько полей, то они имеют приоритет. Например {name: 1, phone: 1} и {phone: 1, name: 1} выдадут разный результат. 6. Вызываешь Skip и Limit 7. Всё, работа с бд окончена. А ещё лучше, если максимальное количество данных хранить вместе, чтобы не пришлось изобретать велосипед, но тут также стоит учитывать ограничения монги и логику, чтобы было удобно.
Yury
1. Используешь Aggregation 2. Делаешь Lookup (лучше вариант с piplines использовать т.к. сможешь использовать match, чтобы часть результатов отсеить) 3. Если связь является 1 к 1, то результат лучше вытащить из массива, чтобы дальше было проще работать. 4. Выполняешь match (если он тут ещё необходим) 5. Вызываешь Sort, но тут стоит учесть, что если в сортировке участвует несколько полей, то они имеют приоритет. Например {name: 1, phone: 1} и {phone: 1, name: 1} выдадут разный результат. 6. Вызываешь Skip и Limit 7. Всё, работа с бд окончена. А ещё лучше, если максимальное количество данных хранить вместе, чтобы не пришлось изобретать велосипед, но тут также стоит учитывать ограничения монги и логику, чтобы было удобно.
Да возможно слишком простой пример привел. Связь один ко многим в реальных данных. И там, конечно же, обязательно нужно ссылаться на ID, ибо изменение одного документа может повлечь изменение тысячи других.
Yury
Тогда 3 пункт пропускаете и всё
Спасибо, буду пробовать
Dmitry
Спасибо, буду пробовать
Если есть возможность до lookup вызвать match, то лучше вызвать, а ешё не нравится, что у вас связь 1 к М, возможно всё таки стоит $unwind вызвать, но это чисто моё предположение т.к. не знаю, что на вашей кухне творится и что вы конкретно хотите там сварить
Dmitry
интересный оператор, не использовал раньше. А он может разворачивать по массиву монговских айдишников?
Было: { _id: 63b6c28846290c4325072894, filed: [63b7f82246290c4325072897, 63a41e991c294fff26ad317b] } Стало: { _id: 63b6c28846290c4325072894, filed: 63b7f82246290c4325072897 } { _id: 63b6c28846290c4325072894, filed: 63a41e991c294fff26ad317b }
Nick
не забывайте что лукап он как бы двусторонний и ничего не мешает делать запрос на другой коллекции где как раз надо больше фильтровать или фильтр сложный
Ratatata
всем привет. подскажите пожалуйста. использую mongoDb aggregation для пагинации и фильтрации. Возникла проблема с skip и limit. Если они заданы, то все работает как надо. Однако если они undefined, то все ломается. Выдает exception что limit must be positive number
Dmitry
Вроде можно 0 передать и ничего не сломается
Ratatata
в коде проверяйте задано или нет и составляйте пайплайн руками
я сразу это попробовал и внутри aggregate делал так limit ? {$limit: skip + limit} : {$limit: 0}, skip ? {$skip: skip} : {$skip : 0} Проблема наступает если skip undefined, а limit нет Нужно получается глобально проверку делать и создавать несколько pipeline?
Sergey
Привет! Подскажите пожалуйста, можно ли на питоне реализовать аналог $addtoset? Пытаюсь в цикле добавлять в существующий документ ссылки. $set затирает прошлые значения, а нужно именно добавлять
Dmitry
И какой язык вы используете, это не важно
Sergey
И какой язык вы используете, это не важно
К сожалению в питоне не удается запустить нативные ключи из монго. WriteError: Unknown modifier: $addtoset. Expected a valid update modifier or pipeline-style update specified as an array push же не принимает строки, но я сейчас попробую возвращать массив, спасибо)
Sergey
Покажите код
https://pastebin.com/5Y8KaVcf
Sergey
pymongo.errors.WriteError: The field 'file_link' must be an array but is of type string in document {_id: 3787551}, full error: {'index': 0, 'code': 2, 'errmsg': "The field 'file_link' must be an array but is of type string in document {_id: 3787551}"}
Sergey
А вчера я боролся с массивом, что бы заработал set :)
Dmitry
А вчера я боролся с массивом, что бы заработал set :)
$set нужен, чтобы полностью обновить поле
Dmitry
Либо добавить, если его нет
Dmitry
https://pastebin.com/5Y8KaVcf
У вас в коде действительно так написано? Просто вы циклом обновляете по 1 документу. Тогда смысл использовать _many
Sergey
У вас в коде действительно так написано? Просто вы циклом обновляете по 1 документу. Тогда смысл использовать _many
Да, прямо копипаст Было _one, но я уже отчаялся и методом научного тыка пытаюсь решить проблему :)
Sergey
$set нужен, чтобы полностью обновить поле
Это уже понял, вариант не подошел, нужно именно добавлять значения, желательно, конечно, проверять на уникальность
Dmitry
Это уже понял, вариант не подошел, нужно именно добавлять значения, желательно, конечно, проверять на уникальность
_db_many.update_one({ "_id": _x["relationships"]["parent_id"]}, {"$addToSet": {"file_link": _x["file"]["url"]} }})
Sergey
Если выдаст ошибку, что не массив, то покажите что в БД лежит
Да, опять ошибка pymongo.errors.WriteError: Cannot apply $addToSet to non-array field. Field named 'file_link' has non-array type string, full error: {'index': 0, 'code': 2, 'errmsg': "Cannot apply $addToSet to non-array field. Field named 'file_link' has non-array type string"}
Dmitry
Когда вы документ создали или обновили, сменился тип и теперь из-за этого ошибка
Sergey
Когда вы документ создали или обновили, сменился тип и теперь из-за этого ошибка
При создании строкой задается.. Почти уверен был, что добавлял строки в монгу и проблем с этим не было. Наверное и тут стоило генерить строку заранее и добавлять :)
Dmitry
При создании строкой задается.. Почти уверен был, что добавлял строки в монгу и проблем с этим не было. Наверное и тут стоило генерить строку заранее и добавлять :)
Чтобы вам исправить проблему. Надо вытащить всё документы, сделать преобразование в массив, при условии, что это строка и за set результат в бд. Тогда у вас заработает и $push и $addToSet.
Sergey
Чтобы вам исправить проблему. Надо вытащить всё документы, сделать преобразование в массив, при условии, что это строка и за set результат в бд. Тогда у вас заработает и $push и $addToSet.
Я не руками базу создаю, она парсится из json, получаемый по api. Вероятнее всего прилетает как строка, ей и остается. Рассмотрю сейчас вариант изменения строки на массив (с сохранением содержимого), либо генерации массива уже отдельным полем
Никита InS
Ребят, с чем может быть связано, что Shell не выводит данные при почти любой команде... выдает название базы данных..🤔 ?
Никита InS
до этого норм работало
Никита InS
уверены, что данные есть?
да, импортировал через json-файл
Vladyslav
также запутстите запрос не через shell, а что-то другое или в самом атлассе
Никита InS
хотелось бы через Shell чтоб все норм работало
Vladyslav
у вас название таблицы с маленькой в запросе, на скрине большая - чекните это еще
Никита InS
у вас название таблицы с маленькой в запросе, на скрине большая - чекните это еще
т.е. mongo чувствителен к регистру ?! (я только изучаю еще, если что..)
Vladyslav
т.е. mongo чувствителен к регистру ?! (я только изучаю еще, если что..)
просто как вариант кинул, не знаю как shell работает)
Vladyslav
пользуюсь 3t studio, рекомендую
Никита InS
буду знать!))
Никита InS
Андрей
MongooseError: Operation `users.findOne()` buffering timed out after 10000ms at Timeout.<anonymous> (/home/admin/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:158:23) Что с монгуз стало вдруг? новый сервак сча настроил и чет рип
Андрей
А если коннектиться через localhost то очень долго к бд коннект идет, но если через 127.0.0.1, то моментально, но при запросах шлет ошибку: [UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "null".] { code: 'ERR_UNHANDLED_REJECTION'
Андрей
Я уже и монго и монгуз откатил, нихера не помогает
O.
отпишите потом как показало себя на пром данных
Апгрейднулись на 4.4.18 4.2.23 -> 4.4.18 112k пользователей 30 миллионов операций Буст: 1m -> 20sec 42k пользователей 30 миллионов операций Буст: 57sec -> 26sec Т.е. прирост очевидный даже на 4.4 На 5.0.х в космос полетим?)))
O.
Тестов ещё маловато было Времени недостаточно прошло Но результат положительный На 5.0.х за счёт индексов возможно 2x получим результат Надеюсь))
O.
ну космос врятли, ощущение что использование индексов бекпортировали
Посмотрим на 5 версии финальный результат Пока все радует
O.
Вопрос Нет никаких бенчмарков? Скажем по миграциям с 4.2 на 4.4 и далее на 5.0 В документации нет В гугле - первые ссылки не внушают доверие Или я один так озадачиваюсь?