2015-05-12 2 views
0

Я пытаюсь сделать групповой запрос на фильтрацию mongodb (используя mongoose) любым другим полем, кроме критериев группы. У меня есть это на данный момент:группа по фильтрации mongodb по любому полю

usersDB.aggregate().group (
    {_id: '$residence', total: { $sum: 1 } } 
).exec(function (err, result) { 
     if(err) res.send(err); 
     else res.send(result); 
}); 

И это работает ... он показывает мне, например:

[{"_id":"Javea","total":40},{"_id":"Benissa","total":28},{"_id":"Calpe","total":41},{"_id":"Teulada","total":14}] 

Но теперь, что я хочу сделать, это фильтрация тоже по дате последнего посещения (last_visit - другое поле UsersDB). Я пробовал:

usersDB.find({$and:[{last_visit:{$lt:date}}, {last_visit:{$gt:date.setMonth(3)}}]}).aggregate().group(
    {_id: '$residence', total: { $sum: 1 } }).exec(
    function (err, result) { 
     if(err) res.send(err); 
     else res.send(result); 
    }); 

И, конечно же, это не работает!

Любое предложение?

ответ

1

Вам нужно сделать фильтрацию в трубопроводе агрегации с помощью стадии $match оператора:

var start = date, end = date; 
end.setMonth(3); 
var query = { "last_visit": { "$lt": end, "$gt": start } }; 

usersDB.aggregate() 
     .match(query) 
     .group({"_id": "$residence", "total": { "$sum": 1 } }) 
     .exec(function (err, result) { 
      if(err) res.send(err); 
      else res.send(result); 
     }); 
1

в Монго оболочки, это выглядит как:

db.users.aggregate([ 
{ $match : { $and [{last_visit:{$lt:date}}, {last_visit:{$gt:date.setMonth(3)}}]}}, 
{ $group : { _id: '$residence', total: { $sum: 1 } }} 
]); 
Смежные вопросы