Yehor
Bogdan
Roman
Хорошо, как мне поможет начало и конец тренировки?
Bogdan
"я хочу вывести результат за день" - несколько тренировок может быть, начало в 13:00, конец в 13:05, значит одна тренировка 5 минут, плюс несколько других и будет результат за день: 25 минут
Roman
Roman
Например. Он занимался с 13:00 до 14:00 сегодня. Значит его нужно посчитать. Если он занимался с 13:00 до 14:00 вчера а фильтр идет за 24 часа каждый день. То он не попадает
Roman
Roman
UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value
Roman
.find({ 'fieldA': { 'fieldB': { 'date': { $lte: new Date() } }}}).exec()
Roman
Почему ошибка?
Roman
async find() {
const users = await this.userModel.find({})
.populate([{
path: 'result',
populate: [{path: 'object'}],
}])
.find({result: {object: {date: { $lte: new Date() } }}}).exec()
return data;
}
Что не так?
Promise.all([🥚, 🥚,
Как минимум, ты пытаешься возвратить data, которая не определена в функции. Замени на users
Promise.all([🥚, 🥚,
+ тут достаточно на выходе просто промис вернуть, async-await тут излишен
Roman
Roman
Arams
народ как сделать отрицание? нужно вернуть запись где два поля совпадают, но айди не совпадает с тем который приходит в запросе
const candidate = await Shelving.find({
$and: [{ location: req.body.location }, { name: req.body.name }, {_id:!req.body._id}]
})
Arams
а...
Roman
🤷♂
Arams
понимаю что нужно заюзать $not, только вот где
Arams
Shelving.find({
$and: [{ location: req.body.location }, { name: req.body.name }],
$not: [{ _id: req.body._id }]
})
так не работает
Arams
в общем нужно вытащить там где location и name совпадают, но при этом не тот id который в запросе приходит с клиента
Roman
А populate в монге возвращает массив?
Roman
Josh
Josh
и $and тут не нужен, и так сцепка логически "И"
Josh
{
location: req.body.location,
name: req.body,name,
_id: { $ne: req.body._id }
}
Josh
одним запросом выцепить первых 5 дока и 3 дока от указанного по отсортированному значению соседние, включая указанный:
итого с параметром 12
1 2 3 4 5 ... 11 12 13
через $facet первые легко, так что задача сводится ко второй части, через что бы реализовать это? чехарда суррогата появляется
на клиенте легко – это я уже, но хочется красиво
если завтра кто встанет, заглянет в чатик и ему придёт мысля – пингани плез
Arams
Josh
да зашел себе спросить, но увидел вопрос попроще :)
Josh
ого, несколько минут валяется
Александра
Подскажите удобный инструмент для проектирования?
Roman
async find() {
const data = await this.userModel.find({})
.populate(path: 'result')
.find({result.date: { $lte: new Date() } }}).exec()
return data;
Этот код не сработает? Так как populate возвращает массив, а result это обьект
Roman
Можно вообще писать
find ({}).populate ('object').find (фильтр) ?
Cheslav
вчера спрашивал, подскажите плз как правильно эти две выделенные строки сделать в монгусе
Cheslav
Roman
Обьясните по-простому что делает оператор $unwind?
yopp
Вам нужно для каждого типа объектов завести по своей схеме.
Для каждой схемы настроить указанные отношения.
One-to-one (User has one Role) отношения обычно хранят ссылку со стороны источника отношения (в документах в users есть поле role_id)
One-to-many (User has many Comments) отношения обычно хранят ссылку со стороны получается отношения (в документах в comments есть поле user_id)
Обычно рефлексию, т.е обратную ссылку хранить не надо, так как её всегда можно логически восстановить.
Например все комментарии конкретного пользователя можно выбрать по полю user_id и нет смысла хранить у пользователя список его комментариев.
По-моему такие рефлексии можно делать через Populate Virtuals
https://mongoosejs.com/docs/populate.html#populate-virtuals
yopp
Обьясните по-простому что делает оператор $unwind?
Делает из массива внутри документа, по документу.
Например имея на входе
{_id: 1, foo: [11,12]}
{_id: 2, foo: [21, 22]}
Шаг $unwind по foo развернёт это в следующий набор документов на ввыходе
{_id: 1, foo: 11}
{_id: 1, foo: 12}
{_id: 2, foo: 21}
{_id: 2, foo: 22}
Cheslav
Cheslav
там сложнее
Josh
$search че за стейдж такой? чет загуглить тяжело и в пайплайн доке не вижу
Josh
Josh
@dd_bb тык 🌚
Josh
Josh
модель
{ dust: Number, username: String }
$search: {
{
near: { path: 'dust', origin: 32, pivot: 10 }
}
}
Josh
тоже не работает, ошибки не выдает, но и результата тоже
Josh
данные конечно есть для выборки, чяднт
Josh
yopp
Его нет в CE/EE
Josh
Josh
я в атласе делаю
Josh
Его нет в CE/EE
вообще задача выбрать 3 дока, ближайших по значению к заданному
{ dust: 99 }
{ dust: 100 }
{ dust: 101 }
yopp
У $search шага нет оператора search
Josh
yopp
Josh
Josh
не ищет, индекс убирал да
yopp
А индекс по этому полю с какими маппингами создан?
Josh
Josh
в примере там не указан
yopp
Там mappings: {fields: { dust: { type: number }} есть?
Josh
Josh
Josh
наверняка number указался
Josh
тянуть на клиент все данные для выборки 3х – звучит неочень, хотя б пагинацию через бакет уж тогда сделать какую
Josh
в принципе это не десятки КБ даже, так то можно, но хочется нормального решения, потому что этот кейс уже 3 раз встречается
Josh
Vlad
Привет. А что я делаю не так при подключении к бд? Гуглил ошибку, но ответы, в основном, для Windows пользователей :(
yopp
К сожалению я не знаю как работает компас с индексами у атласа. Судя по тому что набор параметров там не совпадает с теми, которые указаны в документации — не очень хорошо работает. Рекомендую вручную создать индекс по документации.
Ваш кейс описан вот тут: https://docs.atlas.mongodb.com/reference/atlas-search/near/#number-example
Nick
я в атласе делаю
т.е. вы сразу приговариваете себя к вендор локу и готовы навсегда связать свой софт с ними?
Josh
Nick
странное решение конечно
Josh
ну или другое решение надо
Josh
можно кешировать конеш, но запросом чет ну никак, пробовал добавить поле, но для этого надо в стейдж перед этим сформировать запросом с чем сравнивать
Josh
Nick
какая часть вызывает сложность?