yopp
последний элемент можно взять через использование отрицательного индекса
yopp
-1 == последний элемент
Google
yopp
yopp
используйте update pipeline
Google
но из history я должен брать по ид
yopp
по какому из двух?
Google
con_id
yopp
если вам поле _id (не con_id) не нужно, то в этом случае найдите откуда оно у вас возникает и отключите это поведение
yopp
в этом случае $addToSet будет работать
yopp
либо как я выше писал, напишите ручную проверку используя update pipeline
Google
_id эту надо отключить ?
yopp
да
Google
как могу отключить ?
yopp
они у вас разные, по этому $addToSet добавляет новый элемент массива
yopp
здесь я помочь не смогу, скорее всего это ваш драйвер/odm добавляет
yopp
возможно на уровне вашего odm есть возможность правильно задать embedded realtions со свойством уникальности
Google
сделал так когда из массива чтота меняю дубликат идёт если не меняю то дубликат не идёт
Google
con_id удалил
ᅠEmil 🇦🇿
Лично я делаю не через апдейт. Я приравниваю к переменной какой-то найденную через findOne часть, меняю нужный элемент в той переменной и сохраняю её в базу
ᅠEmil 🇦🇿
const referDB = await User.findOne({ID: refer}).exec()
referDB.refNum = referDB.refNum + 1
referDB.save()
ᅠEmil 🇦🇿
const user = await User.findOne({ID: msg.chat.id}).exec()
.then( () => {bot.sendMessage(msg.chat.id, "+++")} )
.catch( (err) => {console.log(err)})
bot.sendMessage(msg.chat.id, user.name)
ᅠEmil 🇦🇿
Здравствуйте, такая проблема, +++ он выводит, но на user.name даёт ошибку:
2021-03-14T10:47:59.867231+00:00 app[worker.1]: (node:4) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'name' of undefined
На моём компе если сервер загружаю всё ок, на heroku ошибка
Anonymous
updateOne может возвращать данные, которые были записаны?
Dmitry
Всем привет! В MongoDB записали ip адреса в формата: xxx.xx.xx.x Построили по этому полу индекс: db.users.createIndex({ip_address: ‘’text’’}). Пробуем искать по этому полю: coll.find({"$text": {"$search": f'"{ip}"'}}, {"_id": 0}) - и время поиска очень большое, то есть индексы не работают, почему?
Алексей
Всем привет. Из GridFS удаляю файлы. Нужно место на диске освободить. Но оно не освобождается. Вызов compact не помогает. Версия 3.6. Есть мысли почему? В доке написано что после compact должно место освободиться.
Andrey
Andrey
Если у вас ipv4 - пишите int-ами
Andrey
И с местом чуть сэкономите
Andrey
И поиск прозрачней
Andrey
И индекс по целом
Andrey
Или пишите и строкой и целым представлением. Индекс по целому
Andrey
По целому ищите а выдавайте строкой
Andrey
И под подсетям (маскам) проще искать тогда и вообще лучше на мой взгляд
Dmitry
Неправильно
Согласен, разумные предложения. Для понимания подскажите почему точка в строках, которые хранятся в MongoDB и которым построен индекс, не позволяют индексу работать, то есть поиск идет крайне медленно?
Dmitry
Просто индекс имеется ввиду не полнотекстовый, а простой типа бинарного дерева. Можно ли на одно поле навесить несколько индексов, если да то стоит при поиске указать какой индекс использовать?
Andrey
Andrey
Andrey
я в одном проекте видел, как человек складывал ip строками, а поиск по подсетям решал через формирование в коде списка из строк из этой подсети, и потом искал по монге через in....с целыми же у вас 3 варианта, непосредственно поиск по значению, или по подсетем через gte, lte
Dmitry
дело в том, что иногда в этом поле встречаются строки доменный имен, поэтому было принято решение использовать полнотекстовый индекс, но как оказалось из-зи содержании точек в строках с ip-адресами этот полнотекстовый индекс не работает.
Dmitry
(поиск по подсетям не нужен, ip адреса ищутся буквально)
Andrey
Andrey
и чекать не через regex, а через ipaddress(python3)
def check_ip(ip_str: str) -> bool:
"""
Проверка строки на ip адрес
:param ip_str:
:return:
"""
try:
ip_address(ip_str)
return True
except BaseException:
return False
Andrey
примерно наверно так чекать
Dmitry
идея отличная, но БД переписывать нельзя, используем ее как есть. в качестве быстрого решения попробую на поле ip_address навесить обычный индекс, возможно это ускорит поиск по нему. хотелось бы глобально понять почему полнотекстовый индекс не рабтает со строками содержащие точки?
Andrey
"в качестве быстрого решения попробую на поле ip_address навесить обычный индекс" - будет быстрее.
Dmitry
yopp
yopp
Алексей
yopp
yopp
WiredTiger.
А в stats, в wiredTiger.block manager какие значения?
yopp
Вы вызываете compact на коллекции с чанками ?
yopp
Не использовать text индекс
yopp
У него другая задача: поиск по содержимому текстов с учетом морфологии. Ваша задача это сравнение строк
Dmitry
Возможно в самом начале (когда я записывал данные в mongo) нужно было заменять точки на другой символ? В БД также записаны доменные имена, по которым мне абсолютно точно нужен полнотекстовый поиск, как быть с точками в таком случае?
yopp
yopp
Это очень слабый и дорогой инструмент для очень специфического круга задач, который с ними посредственно справляется
yopp
Его придумали как поиск именно по текстам. Для других целей он абсолютно не подходит из-за своей внутренней реализации
yopp
Поиск по префиксу
yopp
/\Agoogle/
Dmitry
Этот тип поиска требует построение какого индекса по полю с доменами ?
yopp
Обычные индексы могут использоваться для поиску по префиксу, если в регулярном выражении явно задан маркер начала строки
Andrey
Dmitry
Понял, значит мы стреляли из пушки по комарам, верно?
yopp
Dmitry
Поиск по префиксу
а что если в поле с доменами встречается такое: "0.145.227.35.bc.googleusercontent.com’’ - тут поиск с префексом справится?
yopp
Andrey
слушай...ну можно накостылить прям костылей..если данных прям много много...пишите документы с учетом новых полей(host, ipv4), с такой даты искать так-то, а с такой-то так то, и в коде предусмотрите обработку записей с учетом новых полей...если уж костылить
Dmitry
Скорее старым мушкетом :)
Возможно можно утверждать что если у вас много текстовых сообщений и вы хотите искать среди них подстроки, то используйте elasticsearch но не mongo?
Andrey
yopp
yopp
Текстовый индекс это скорее про «быстро сделать хоть какой-то поиск который ищет по словам»
yopp
Если задача сложнее чем запросы по целым словам с not/or/and, то не подходит
yopp
Ключевое слово тут «целое слово» :)