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
а где там аггрегация
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}?
Rrr
Bro
т.е. просто тупо $match: {$gte: sundayBattle}
Bro
да
Bro
шаришь
Bro
ну и потом груп делай и проекцию и собирай как надо
Rrr
так вроде понятней, спасибо
Bro
пожалуйста. в начале немного не въехал что там нужно было.
Rrr
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 - вместо этого попробуй просто название. это я так понимаю сразу в коде где-то
Rrr
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
во