Anton
есть индекс по query
надо индекс для $nor: query
Dmytro
если я использую приложение в одно лицо
Dmytro
то уместен только mongoose.connect
Dmytro
но дока пишет, что если несколько кластеров (а у меня не так всё круто), то надо юзать createConnection
Dmytro
но прикол в том, что задача простая - уметь открыть два соединения. как и в других РБД
Dmytro
как какой тут подход? один раз открываю коннекшн и он keep alive?
Dmytro
или если есть запрос - открыл соединение, потом выборка какая-нибудь (например), а потом закрыть.
Dmytro
Что правильно?
Dmytro
@AntonKrevedko
Dmytro
а если 2+ юзеров
Dmytro
конфигурировать await Mongoose.connect(uri, {
useNewUrlParser: true,
poolSize: 3,
});
Dmytro
уместно ли вообще убивать тогда соединение7
Dmytro
Получается этакая регистрация коннекшена, и таких максимум poolSize
Dmytro
```MongooseError: Operation users.insertOne() buffering timed out after 10000ms
at Timeout.<anonymous> (/Users/dkryshtopenko/WebstormProjects/kryshdotos/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:184:20)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7)
не прошу много, не знаю как в таком случае победить второе открытие сессии
Dmytro
export const connect = async (): Promise<Mongoose.Connection> => {
if (!database) {
await Mongoose.connect(uri, {
useNewUrlParser: true,
poolSize: 3,
});
database = Mongoose.connection
.once('open', async () => {
console.log('Connected to database');
})
.on('error', () => {
console.log('Error connecting to database');
});
}
return database;
};
export const disconnect = async (): Promise<void> => {
if (database) {
await Mongoose.disconnect();
}
};
Dmytro
открыл пул, что-тозаписал, закрыл
Dmytro
вызываю метод снова, ошибка выше.
Dmytro
@AntonKrevedko
Dmytro
странно, ибо пример брал с офф доки
yopp
yopp
открытие соединения дорогая операция, особенно если там tls
yopp
накладные расходы на открытое соединение со стороны монги незначитаельные
yopp
сессия != соединение
Dmytro
закрывать соединение нельзя, больше одного соед нельзя создавать
yopp
когда вы делаете mongoose.connect вы открываете пул соединений
yopp
он автоматически наполняется по мере требования до maxPoolSize
yopp
после достижения лимита и отсустствии свободных соединений в пуле, в зависимости от опции, вы или исключение получите или запрос встанет в очередь
Dmytro
yopp
я не помню точно, помоему-то там нет таймаута, а есть ограничение на глубину очереди
yopp
посмотрите в документации
yopp
https://mongoosejs.com/docs/faq.html#callback_never_executes
yopp
В атласе помоему есть такая опция
Dmytro
ну и еще вопрос интели сенса
Dmytro
UserSchema.statics.findOneOrCreate = findOneOrCreate;
UserSchema.statics.findByAge = findByAge;
UserSchema.methods.setLastUpdated = setLastUpdated;
UserSchema.methods.sameLastName = sameLastName;
Dmytro
я примапил статические и методы экзамляра
Dmytro
Dmytro
всё работает. Выборка происходит.
Dmytro
Но в словаре их нет. Можно как-то избавиться от невалидного undefined
Egor
Всем привет! Такой вопрос:
Есть коллекция моделей вида {
name: String;
cats: [{
id: string;
name: string;
}]
}
которая хостится в на cloud.mongodb
есть запросы в базу в виде транзакции которые одновременно делают $push и $pull по несколько новых сущностей в массив cats
как научить монгу с помощью дашборда в клауде или чего угодно присылать евент апдейта модели в котором можно будет понять какие объекты были удалены а какие добавились в массив cats ?
Egor
(Если что - дефолтный листнер для update + вэбхук в дашборде не решают проблему )
Dima
всем привет
посоветуйте плез решения для переезда с одного кластера на другой без остановки
пробовал официальный mongomirror, работает прямо скажем так себе, копирует супер долго и крашится при любой удобной возможности + не дает накатывать отдельные коллекции, сразу весь кластер фигачит
спасибо
yopp
yopp
если на atlas переезжать, там есть инструмент миграции
Dima
это он и есть
там под капотом mongomirror
Dima
но репликации master master нет же =(
yopp
yopp
Dima
нет, который для переезда - чистый
yopp
на чистом сбросить настройки репликации, ввести все новые ноды в существующий кластер, дождаться завершения репликации, установить новым нодам более высокий приоритет, сделать stepdown
yopp
вывести старые ноды из кластера
yopp
если вы пытаетесь переехать на атлас и увас проблемы с импортом, то пишите в поддержку
Dima
спасибо за вариант
Dima
да техподдержка это то с чего начал)) но они довольно бесполезные ребята
yopp
т.е вы пытаетесь импортировать данные в атлас?
Dima
да
yopp
вы не сможете в кластер в атласе добавить свои ноды
yopp
а какой у вас объём данных и как далеко расположен от вашего кластера в атласе?
Dima
не чтобы прям сильно большой, на проде до 200 гигов
в том же регионе
yopp
напишите на mrc@mongodb.com с подробностями, скажите что у вас проблемы с миграцией, какие у вас симптомы
yopp
ещё можете попросить поддержку об эскалации
Dima
окей, спасибо =)
yopp
для M10 и выше помоему доступна ещё и платная поддержка
yopp
не очень дорого было, помоему
yopp
что-то до 100 долларов в месяц
maxsimych
Привет, создавал документы в базе только через
updateOne({ date: '2020-12-25')}, { $setOnInsert: { ...} }, { upsert: true })
Таким образом, подразумевалось, что будут создаваться документы без дубликатов по дате. В реальности, оказалось, что периодически создается по 2 документа. Подскажите, почему такое может происходить, и возможно ли избежать это без уникальных индексов?
Dmitriy
filter: {createdAt: {$gte: "2020-12-14T22:00:00.000Z", $lte: "2020-12-24T22:00:00.000Z"}}
Подскажите, что тут с фильтром не так?
Dmitriy
Вот в базе это поле:
createdAt: 2020-12-16T11:38:21.975+00:00
✙ Nikita
Dmitriy
✙ Nikita
а это в монгошелле выполняется?
✙ Nikita
или где то в коде ?
Dmitriy
Это я с фронта отправляю запрос
Dmitriy
то есть я отправляю в таком формате, а на Бэке мне преобразовывать в ISODate и тогда должно найти?
Anton
А как можно сделать полную инверсию запроса. Условно есть query надо найти not query
Anton
Учитывая что запрос сложный и просто так его не расписать будет через инверсию
✙ Nikita
Если у меня в одной коллекции ссылки на другие коллекции, как это правильно передавать фронту для отрисовки?
Например какая-то транзакция, и у нее есть customer_id, как првильно передавать это в ответе от сервера чтобы фронт вывел табличку Customer Name / Transaction amount ?
Вариант с populate() имхо не подходит в плане размера ответа, транзакций может быть сотни, а фронту нужно только имя клиента, и тогда в каждой транзакции будет еще вставлен целый документ клиента
Заранее спасибо.
✙ Nikita
P.S. нашел что в populate() можно выбирать поля, это ок тогда, но а вообще какие решения есть?