mongodb过滤任何领域的小组

时间:2015-05-12 13:19:02

标签: node.js mongodb express mongoose mongodb-query

我正在尝试使用mongodb(使用mongoose)进行组查询,除了组标准以外的任何其他字段。我现在有这个:

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);
    });

当然......它没有用!!

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您需要使用Example运算符阶段在聚合管道中进行过滤:

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 :(得分:1)

在mongo shell中,它看起来像是:

db.users.aggregate([
{ $match : { $and [{last_visit:{$lt:date}}, {last_visit:{$gt:date.setMonth(3)}}]}},
{ $group : { _id: '$residence', total: { $sum: 1 } }}
]);