Node.js 按任何字段筛选mongodb上的组
我正在尝试对mongodb进行组查询(使用mongoose),并根据组条件以外的任何其他字段进行过滤。我现在有这个:Node.js 按任何字段筛选mongodb上的组,node.js,mongodb,express,mongoose,mongodb-query,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); }); 而且它是有效的。。。例如,它向我展示
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);
});
当然。。。它不起作用
有什么建议吗?您需要使用operator阶段在聚合管道中进行过滤:
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);
});
在mongo shell中,它看起来像:
db.users.aggregate([
{ $match : { $and [{last_visit:{$lt:date}}, {last_visit:{$gt:date.setMonth(3)}}]}},
{ $group : { _id: '$residence', total: { $sum: 1 } }}
]);