CybernatiC
...find({'jobTitle': req.query.q})
CybernatiC
может так?
Artur
...find({'jobTitle': req.query.q})
Что-то непонятное по-моему, нужно найти все записи с текстом req.query.q
CybernatiC
может там надо RegExp
CybernatiC
https://docs.mongodb.com/manual/reference/operator/query/regex/
Artur
может там надо RegExp
Такая ошибка
Artur
Хотя вроде индекс добавлен
CybernatiC
Но в ошибке говорит что индекса нет
Artur
Но в ошибке говорит что индекса нет
https://stackoverflow.com/questions/57057293/full-text-search-on-mlab-with-mongoose-mongoerror-text-index-required-for-tex
Artur
Так вот тут такую же ошибку описывают, индекс то у меня и у него есть. Только что-то не для Mongoose пишут
Artur
Вот у меня индекс
Artur
Как в moongose можно индексы посмотреть?
yopp
К слову сказать, мне нужно запрашивать эти 10,000 значений для того, чтобы посчитать среднее значение по ним. И знаете, aggregation framework это делает, как ни странно, гораздо быстрее, чем запросить-посчитать ручками в коде (где то за 35 мс выполняется в среднем). И я бы так и делал, только вот одно меня смущает. Скорее всего эти агрегации будут ощутимо грузить базу. Учитывая, что данная статистика хранится для каждого пользователя приложения, делать это придется очень часто и много. И я сейчас на самом деле перед выбором: либо все таки доверится aggregation framework-у, пусть база сама считает да агрегирует, или все таки выгружать и считать самостоятельно (но тогда придется разбираться с медленными запросами). Это конечно супербалдежно - пользователь кликает на вкладку статистика, запрос уходит на сервер, и сервер начинает пыхтеть и целую секунду все это дело запрашивать, перебирать, считать. Да пользователь уснет от скуки, пока расчет закончится и результат вернется на фронт.
Сделайте поля sum и count и обновляйте через $inc при добавлении значения. На 4.2 можно ещё значение поля avg сразу считать, через AF в findAndModify
Anonymous
ребят подскажите кейс. делаю Колекцию пользователей, у них должны быть группы в которых указаны их права. Пришел я с mysql и для меня бы было проще просто указанать индификатор группы(left join). Ну а как это тогда сделать в Mongo?
S
UsersSchema.statics.isEmailExists = async function (email: string): Promise<any> { return await this.findOne({ email }); };Тут правильно что я завернул поиск email в асинхронную функцию? Далее в роуте я вызываю const isEmailExists = await Users.isEmailExists(email);
yopp
в коллекции ранее были документы?
yopp
и туда сложите идентификаторы групп
Anonymous
в коллекции ранее были документы?
спасибо, а как лучше сделать индификаторы? Object_id не подходит
yopp
сделать так, чтоб objectid подошёл
yopp
что-то другое, кроме objectid в большинстве случаев не стоит использовать
RapidCodeLab
в коллекции ранее были документы?
Что значит ранее?) Сначала там не было документов, далее на регулярной основе стали добавляться
yopp
38гб вы как посчитали?
RapidCodeLab
Увидел файл collection-6 что то там, который занимает такой объем , и по df -h , и по логам увидел, что перестал добавлять данные из за диска
RapidCodeLab
Через 15 буду за компом и покажу детально
RapidCodeLab
отбой, все с монгой впорядке, спросони не то увидел, диск сожрало что то другое
S
Не могли бы объяснить , зачем нужны вторичные индексы? В доке по Mongodb говорится что индексы нужны для эффективного выполнения запросов, а в доке по mongoose пишется что на проде их нужно вырубать 😕
Alexey
хотя я сейчас подумал, что может он и реконнектится, просто я в этот момент пишу, и падает в ошибку не коннек, а попытка записи, но драйвер сам не должен откладывать попытку записи до подклбчения к новому праймари?
Alexey
в смысле как? db.collection.getIndexes()
S
вот тут думал может где то отображается
Alexey
у вас должна быть монга 3.6+ и драйвер должен поддерживать retryWrites и retryWrites должны быть включены
блин, извиняюсь, я не в ту сторону смотрел, действительно я просто не повесил обработчик ошибок на insert, все отлично переподключается к новому праймари
Alexey
И еще вопрос, у меня идет подключение через srv, который ведет на три ноды. Если я использую флаг useUnifiedTopology: true, который рекомендуется использовать в драйвере, то при подключении, если одна из нод мертва, соединение падает в ошибку ECONNREFUSED, без флага оно коннектится, я читал, что с этим флагом меняется логика обнаружения шардов и новых нод в репликах, но как-то так себе, если у нее не происходит connect
Alexey
?
в чем задача?
S
в чем задача?
я просто читаю документацию и встал на этом моменте про индексы, а именно вырубание автоиндексов на проде. Я сейчас ставлю autoIndex: false но при методе getIndexes он показывает такой объект: { { _id_: [ [ '_id', 1 ] ], email_1: [ [ 'email', 1 ] ], test_1: [ [ 'test', 1 ] ] } }Значит автоиндекс еще работает? И как вообще кроме этого метода увидеть что есть индексы , в nosqldriver никаких изменений не появляется
yopp
https://jira.mongodb.org/browse/NODE-2231
Alexey
Это к вашему драйверу вопрос
так вот в том-то и проблема, неужели есть такая проблема у node-mongodb-native, ладно я от монгуса отказался, потому что у меня половина работает не так, как я хочу, но чтобы такие странные вещи в node-mongodb-native происходили
yopp
Никакой жести
yopp
Добро пожаловать в волшебный мир драйверов для баз данных.
Alexey
Добро пожаловать в волшебный мир драйверов для баз данных.
да я все понимаю, но я не ожидал, что все сломается уже на стадии коннекта)
yopp
Вы используете новую версию драйвера, это нормалью
yopp
Откатитесь до 3.2.х и подождите пока ваши баги не поправят
Alexey
Откатитесь до 3.2.х и подождите пока ваши баги не поправят
спасибо большое за ответы и за тему на жире! а то я все-таки думал, что у меня какие-то проблемы
S
кроме этого метода я написал, зайди лучше через mongo shell и там проверь db.collection.getIndexes()
в шеле все ок, если создавать через db.users.createIndex все шикарно, но как создавать через mongoose, я хочу чтобы индекс создавался при объявлении схемы как в доке const UsersSchema = new Schema({ email: { type: String, index: true, unique: true }, hash: String, salt: String, uid: String }); UsersSchema.index({ email: 1 });
Alexey
в шеле все ок, если создавать через db.users.createIndex все шикарно, но как создавать через mongoose, я хочу чтобы индекс создавался при объявлении схемы как в доке const UsersSchema = new Schema({ email: { type: String, index: true, unique: true }, hash: String, salt: String, uid: String }); UsersSchema.index({ email: 1 });
во-первых, не создавай индексы через монгус, во-вторых, не ставь их автосоздание, вообще не работай с индексами через монгус, индексы относятся к части администрирования базы и ее архитектуры, это не задача приложения, ну это мое мнение, может кто-то имеет другое
Alexey
🤷🏻‍♂️если в компании есть специальнообученные для этого люди, то хороший совет)
да даже если нету, когда у тебя внезапно в проде при перезапуске начинает индексироваться база на миллионы записей и у тебя ничего не стартует, это нездоровая тема (это конечно чисто гипотетический пример, так как в проде без индексов вообще ничего не должно работать, но все же)
Alexey
я ставлю autoIndex: false и манипулирую индексами только через шелл?
если ты не будешь в схемах указывать что-либо, связанное с индексами и не будешь писать UsersSchema.index({ email: 1 }), то у тебя ничего не создастся, так что просто не пиши UsersSchema.index({ email: 1 }), а так я не помню, чему флаг autoIndex равен по дефолту, ну на всякий случай можешь указать false
Alexey
я ставлю autoIndex: false и манипулирую индексами только через шелл?
ну по мне да, управление индексами лучше делать в ручную и через shell
S
ну по мне да, управление индексами лучше делать в ручную и через shell
извиняюсь за еще один вопрос. Если база огромная и дропается, ты вручную переопределяешь индексы?
Aleksandr
добрый день. делаю запрос примерного вида collection.update({field_0: value, $exists:{field_1: False }}, {$set: {field_1: value } }) - т.е ищет документ, и если нет поля, добавляет его. Все работает, но хочется, чтобы выдавало всегда текущий документ из БД, а не пустой при наличи поля
Aleksandr
Можно обойтись условием и доп запросом в логике, но думаю есть путь проще
Alexey
ну если у тебя данные физически живы, то и индексы живы, индекс, это отдельная коллекция по факту, это не что-то временное, они просто во время работы выгружаются в оперативу и там хранятся в виде таблицы ключ(поля индекса)->значение(документ), если ты снесешь коллекцию в базе, только тогда пропадут ее индексы, ну либо физически вызовешь db.collection.dropIndexes(), т е пока файловая система жива и пока ты сам с индексами что-нибудь не сделал, индексы будут жить, банальная остановка сервера с ними ничего не сделает
Alexey
я просто не очень понимаю, что в твоем понимании дропается, если дроп - потеря базы (физическое ее удаление), то боюсь, что индексы в этот момент не самая серьезная проблема, в остальных случаях с индексами должно быть все ок
Александр
Подскажите - mongod локально стоит и стоит compass Через compass делаю импорт в коллекцию сразу 300 тыс записей и иногда пишет таймаут привышен
Александр
я не могу найти возможность запуска mongod с тайм аут
Александр
connection 110 to localhost:27017 timed out
Александр
в Компассе
Serg
Serg
в компасе
Александр
это я ставлю