Rrr
Привет. Помогите, пожалуйста, с агрегацией. Есть примерно вот такая коллекция, мне нужно получить имя пользователя и только ту часть массива battles, которая соотвествует условию date: { $gte: sundayBattle} [{ t_name:"Username", battles: [ {exp:20, date:2018-07-26 01:00:00.000 }, {exp:20, date:2018-07-27 15:00:00.000 } ] }, {}]
Bro
а где там аггрегация
Rrr
а где там аггрегация
через find есть только $elemMatch, который вернет только первое совпадение
Bro
да
Bro
только хотел написать
Bro
$elemMatch юзай
Bro
в аггрегации тоже можно
Bro
ну так сделай $unwind
Bro
$unwind потом отсекаешь что по суловиям не катит потом груп
Bro
$unwind -> $match -> $group (по юзеру)
Rrr
$unwind -> $match -> $group (по юзеру)
так?) Warrior.aggregate([ {$match:{squad: msg.chat.title}}, {$unwind: "$battles"}, {$match:{battles:{$elemMatch: { date: { $gte: sunday}}}}}, {$group:{user:'$cw_name', battles:'$battles'}} ])
Bro
не
Bro
$elemMatch тебе не нужен
Rrr
сложновато
Rrr
$elemMatch юзай
Rrr
$elemMatch тебе не нужен
Bro
ну если ты анвинд сделал то не нужен
Bro
элем матч просто по массиву итерируется
Bro
а ты его развернул
Rrr
так оставить battles.date: { $gte: sunday}?
Bro
т.е. просто тупо $match: {$gte: sundayBattle}
Bro
да
Bro
шаришь
Bro
ну и потом груп делай и проекцию и собирай как надо
Rrr
так вроде понятней, спасибо
Bro
пожалуйста. в начале немного не въехал что там нужно было.
Bro
"battles.date": {"$gte": ....} вроде так
Bro
$match: {"battles.date": {"$gte": ....}}
Bro
только без кавычек если в консоли монго или js
Rrr
ну и с $group в этой ситуации не очень ясно {$group:{user:'$cw_name', battles:'$battles'}} - так нельзя написать
Rrr
в общем реально проще просто все отфильтровать уже на сервере
Bro
эм?
Bro
ну канешно нельзя
Bro
группируешь ты по чему-то
Bro
что является ключем
Bro
$group: {_id: "$t_name", ....}
Bro
а баттлз засовываешь в список
Bro
типа будет что-то вроде $group: {_id: "$t_name", sunday_battles: {$push: "$battles"}}
Bro
ну и получается ключ один а для этого ключа (юзера) баттлов много и их нужно засунуть в какой-то контейнер (array)
Bro
т.е. $push или $addToSet
Bro
а баттлы уже отфильтрованы по дате
Bro
на предыдущем стэйдже пайплайна
Rrr
вернулся пустой массив в итоге
Rrr
я сдаюсь
Bro
ну сразу никогда не получается
Bro
нужно попробовать то се
Bro
мне не видно че там у тебя поэтому сложно советы давать
Rrr
юзеров если что много
Bro
посмотри на этапе $match все верно? а потом след стэйдж пайплайна смотри
Bro
ну понятно что много у тебя в итоге будет список юзерв с баттлами для каждого
Rrr
Warrior.aggregate([ {$match:{squad: msg.chat.title}}, {$unwind: "$battles"}, {$match:{'battles.date': { $gte: sundayBattle}}}, {$group:{_id:'$t_name', week_battles:{$push:'$battles'}}} ])
Rrr
в итоге так код выглядит
Bro
ну что-то вроде
Bro
работает?
Rrr
неа
Bro
ну убирай потихоньку этапы пайплайна
Bro
$match:{squad: msg.chat.title}} - возвращает результаты?
Bro
msg.chat.title - вместо этого попробуй просто название. это я так понимаю сразу в коде где-то
Bro
$unwind разворачивает как надо?
Bro
что после анвинда получается?
Rrr
фигня какая-то получается как будто всю схему вообще выводит
Rrr
Юзеры дублируются много раз
Bro
ну он разворачивает т.е. у тебя было {_id: 1, lst: [1, 2, 3]} а если сделать $unwind: "$lst" будет {_id: 1, lst: 1}, {_id: 1, lst: 2}, {_id: 1, lst: 3}
Bro
battles разворачивается потом ты его фильтруешь
Bro
{$match:{'battles.date': { $gte: sundayBattle}}},
Bro
это работает?
Rrr
ага
Rrr
на этом этапе пустой массив приходит
Bro
Warrior.aggregate([ {$match:{squad: msg.chat.title}}, {$unwind: "$battles"}, {$group:{_id:'$t_name', count:{$sum:1}}} ])
Bro
попробуй такое будет работать
Bro
может у тебя просто нет записей которые условию удовлетворяют
Rrr
записи точно есть попробую
Rrr
MongoError: unknown group operator '$inc'
Bro
$sum
Bro
вместо $inc
Rrr
{ _id: 'nenravitsa', count: 1 }, такой список
Bro
во