Roman
Хорошо, как мне поможет начало и конец тренировки?
Bogdan
"я хочу вывести результат за день" - несколько тренировок может быть, начало в 13:00, конец в 13:05, значит одна тренировка 5 минут, плюс несколько других и будет результат за день: 25 минут
Roman
Например. Он занимался с 13:00 до 14:00 сегодня. Значит его нужно посчитать. Если он занимался с 13:00 до 14:00 вчера а фильтр идет за 24 часа каждый день. То он не попадает
Bogdan
"Я хочу вывести результат за день (количество спортсменоа которые занимались сегодня)" в таком плане задача
Нужно взять разницу между началом тренировки и "сейчас" и сравнить с сутками в миллисекундах (например), если меньше, тогда это за последниее 24 часа. Если прошло с момента начала тренировки 50 млн миллисекунд, а сутки 86.4 млн, тогда тренировка за последние сутки.
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 тут излишен
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 в монге возвращает массив?
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 первые легко, так что задача сводится ко второй части, через что бы реализовать это? чехарда суррогата появляется на клиенте легко – это я уже, но хочется красиво если завтра кто встанет, заглянет в чатик и ему придёт мысля – пингани плез
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
там сложнее
Josh
$search че за стейдж такой? чет загуглить тяжело и в пайплайн доке не вижу
Josh
Josh
@dd_bb тык 🌚
Josh
дичь
Josh
модель { dust: Number, username: String } $search: { { near: { path: 'dust', origin: 32, pivot: 10 } } }
Josh
тоже не работает, ошибки не выдает, но и результата тоже
Josh
данные конечно есть для выборки, чяднт
yopp
$search че за стейдж такой? чет загуглить тяжело и в пайплайн доке не вижу
Это Atlas Search https://docs.atlas.mongodb.com/reference/atlas-search/query-syntax/#query-syntax-ref
yopp
Его нет в CE/EE
Josh
я в атласе делаю
Josh
Его нет в CE/EE
вообще задача выбрать 3 дока, ближайших по значению к заданному { dust: 99 } { dust: 100 } { dust: 101 }
yopp
дичь
У $search шага нет оператора search
Josh
У $search шага нет оператора search
это да, там косяк был
yopp
Josh
Josh
не ищет, индекс убирал да
yopp
А индекс по этому полю с какими маппингами создан?
Josh
А индекс по этому полю с какими маппингами создан?
деск, но ведь можно вообще не указывать индекс
Josh
в примере там не указан
yopp
Там mappings: {fields: { dust: { type: number }} есть?
Josh
Там mappings: {fields: { dust: { type: number }} есть?
я через компас делал, там не выбирается
Josh
Josh
наверняка number указался
Josh
тянуть на клиент все данные для выборки 3х – звучит неочень, хотя б пагинацию через бакет уж тогда сделать какую
Josh
в принципе это не десятки КБ даже, так то можно, но хочется нормального решения, потому что этот кейс уже 3 раз встречается
Josh
У $search шага нет оператора search
по дефолту так создает
Vlad
Привет. А что я делаю не так при подключении к бд? Гуглил ошибку, но ответы, в основном, для Windows пользователей :(
yopp
Привет. А что я делаю не так при подключении к бд? Гуглил ошибку, но ответы, в основном, для Windows пользователей :(
Проверьте что путь /data/db существует и у пользователя под которым запускается монга есть права на чтение и запись в эту директорию. Если это не та директория, которую вы настроили, проверьте что монга запускается с верным файлом конфигурации
yopp
К сожалению я не знаю как работает компас с индексами у атласа. Судя по тому что набор параметров там не совпадает с теми, которые указаны в документации — не очень хорошо работает. Рекомендую вручную создать индекс по документации. Ваш кейс описан вот тут: https://docs.atlas.mongodb.com/reference/atlas-search/near/#number-example
Nick
я в атласе делаю
т.е. вы сразу приговариваете себя к вендор локу и готовы навсегда связать свой софт с ними?
Nick
странное решение конечно
Josh
ну или другое решение надо
Josh
можно кешировать конеш, но запросом чет ну никак, пробовал добавить поле, но для этого надо в стейдж перед этим сформировать запросом с чем сравнивать
Nick
вообще задача выбрать 3 дока, ближайших по значению к заданному { dust: 99 } { dust: 100 } { dust: 101 }
эта задача решается в пару стейджей project с вычисление модуля разности между вашим числом и тем что в доке sort limit
Nick
какая часть вызывает сложность?