CybernatiC
...find({'jobTitle': req.query.q})
CybernatiC
может так?
CybernatiC
может там надо RegExp
CybernatiC
https://docs.mongodb.com/manual/reference/operator/query/regex/
Artur
Artur
Хотя вроде индекс добавлен
CybernatiC
Но в ошибке говорит что индекса нет
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
yopp
и туда сложите идентификаторы групп
yopp
сделать так, чтоб objectid подошёл
yopp
что-то другое, кроме objectid в большинстве случаев не стоит использовать
Daniil
yopp
38гб вы как посчитали?
RapidCodeLab
Увидел файл collection-6 что то там, который занимает такой объем , и по df -h , и по логам увидел, что перестал добавлять данные из за диска
RapidCodeLab
Через 15 буду за компом и покажу детально
RapidCodeLab
отбой, все с монгой впорядке, спросони не то увидел, диск сожрало что то другое
S
Не могли бы объяснить , зачем нужны вторичные индексы? В доке по Mongodb говорится что индексы нужны для эффективного выполнения запросов, а в доке по mongoose пишется что на проде их нужно вырубать 😕
Alexey
S
yopp
Alexey
Alexey
хотя я сейчас подумал, что может он и реконнектится, просто я в этот момент пишу, и падает в ошибку не коннек, а попытка записи, но драйвер сам не должен откладывать попытку записи до подклбчения к новому праймари?
S
Alexey
в смысле как? db.collection.getIndexes()
yopp
S
S
вот тут думал может где то отображается
yopp
S
Alexey
И еще вопрос, у меня идет подключение через srv, который ведет на три ноды. Если я использую флаг useUnifiedTopology: true, который рекомендуется использовать в драйвере, то при подключении, если одна из нод мертва, соединение падает в ошибку ECONNREFUSED, без флага оно коннектится, я читал, что с этим флагом меняется логика обнаружения шардов и новых нод в репликах, но как-то так себе, если у нее не происходит connect
Alexey
yopp
И еще вопрос, у меня идет подключение через srv, который ведет на три ноды. Если я использую флаг useUnifiedTopology: true, который рекомендуется использовать в драйвере, то при подключении, если одна из нод мертва, соединение падает в ошибку ECONNREFUSED, без флага оно коннектится, я читал, что с этим флагом меняется логика обнаружения шардов и новых нод в репликах, но как-то так себе, если у нее не происходит connect
Это к вашему драйверу вопрос
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 происходили
Alexey
yopp
Никакой жести
yopp
Добро пожаловать в волшебный мир драйверов для баз данных.
Alexey
я просто читаю документацию и встал на этом моменте про индексы, а именно вырубание автоиндексов на проде. Я сейчас ставлю autoIndex: false но при методе getIndexes он показывает такой объект:
{
{ _id_: [ [ '_id', 1 ] ],
email_1: [ [ 'email', 1 ] ],
test_1: [ [ 'test', 1 ] ] }
}Значит автоиндекс еще работает? И как вообще кроме этого метода увидеть что есть индексы , в nosqldriver никаких изменений не появляется
ну судя по всему у тебя уже создалось три индекса, какая теперь уже разница, что ты отрубил им автосоздание, если физически они уже есть, я никогда не смотрел индексы через монгус
Alexey
yopp
Вы используете новую версию драйвера, это нормалью
yopp
Откатитесь до 3.2.х и подождите пока ваши баги не поправят
Alexey
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 });
во-первых, не создавай индексы через монгус, во-вторых, не ставь их автосоздание, вообще не работай с индексами через монгус, индексы относятся к части администрирования базы и ее архитектуры, это не задача приложения, ну это мое мнение, может кто-то имеет другое
Yurii
Yurii
S
S
Alexey
я ставлю autoIndex: false и манипулирую индексами только через шелл?
если ты не будешь в схемах указывать что-либо, связанное с индексами и не будешь писать UsersSchema.index({ email: 1 }), то у тебя ничего не создастся, так что просто не пиши UsersSchema.index({ email: 1 }), а так я не помню, чему флаг autoIndex равен по дефолту, ну на всякий случай можешь указать false
Aleksandr
добрый день. делаю запрос примерного вида
collection.update({field_0: value, $exists:{field_1: False }}, {$set: {field_1: value } }) - т.е ищет документ, и если нет поля, добавляет его.
Все работает, но хочется, чтобы выдавало всегда текущий документ из БД, а не пустой при наличи поля
Aleksandr
Можно обойтись условием и доп запросом в логике, но думаю есть путь проще
Alexey
ну если у тебя данные физически живы, то и индексы живы, индекс, это отдельная коллекция по факту, это не что-то временное, они просто во время работы выгружаются в оперативу и там хранятся в виде таблицы ключ(поля индекса)->значение(документ), если ты снесешь коллекцию в базе, только тогда пропадут ее индексы, ну либо физически вызовешь db.collection.dropIndexes(), т е пока файловая система жива и пока ты сам с индексами что-нибудь не сделал, индексы будут жить, банальная остановка сервера с ними ничего не сделает
Alexey
я просто не очень понимаю, что в твоем понимании дропается, если дроп - потеря базы (физическое ее удаление), то боюсь, что индексы в этот момент не самая серьезная проблема, в остальных случаях с индексами должно быть все ок
S
ну если у тебя данные физически живы, то и индексы живы, индекс, это отдельная коллекция по факту, это не что-то временное, они просто во время работы выгружаются в оперативу и там хранятся в виде таблицы ключ(поля индекса)->значение(документ), если ты снесешь коллекцию в базе, только тогда пропадут ее индексы, ну либо физически вызовешь db.collection.dropIndexes(), т е пока файловая система жива и пока ты сам с индексами что-нибудь не сделал, индексы будут жить, банальная остановка сервера с ними ничего не сделает
благодарю за потраченное время, теперь начал понимать как они работают
Александр
Подскажите - mongod локально стоит и стоит compass
Через compass делаю импорт в коллекцию сразу 300 тыс записей и иногда пишет таймаут привышен
Александр
я не могу найти возможность запуска mongod с тайм аут
Александр
connection 110 to localhost:27017 timed out
Александр
в Компассе
Serg
Serg
Serg
в компасе
Александр
это я ставлю