现在我已经在$ project,aggregate()和$ group上敲了一下头,现在是时候让我再次投入自己的仁慈。我正在尝试拨打电话,回复用户的总数,按性别分组(这是更容易的部分),并根据年龄段进行分组(这是击败了我)。在总计输出中合并不同的分组汇总
我得到了它的一个工作组:
Person.aggregate([
{
$match: {
user_id: id
}
},
{
$group: {
_id: '$gender',
total: { $sum: 1 }
}
}
])
.exec(function(err, result) {
etc...
从这一点,它会给我多少男人,多少女人在一个不错的JSON输出。但是,如果我添加的第二组,似乎跳过第一扔嘘声像套设于第二:
Person.aggregate([
{
$match: {
user_id: id
}
},
{
$group: {
_id: '$gender',
total: { $sum: 1 }
},
$group: {
_id: '$age',
age: { $gte: 21 },
age: { $lte: 30 },
total: { $sum: 1 }
}
}
])
.exec(function(err, result) {
etc...
它不喜欢的$ GTE或$ LTE。如果我将它切换到$ project,那么它会执行gte/lte,但会抛出$ sum或$ count。最重要的是,我无法在如何构建多请求返回的任何地方找到任何示例。这一切都只是“这是一件事情”,但我不想为了获得所有人员年龄段而打12个电话。我希望的,看起来像这样的输出:
[
{"_id":"male","total":49},
{"_id":"woman","total":42},
{"_id":"age0_10", "total": 1},
{"_id":"age11_20", "total": 5},
{"_id":"age21_30", "total": 15}
]
(我不知道如何针对年龄_id比实际年龄以外的东西,这是没有意义的,B/C我不我想要一个可靠的名字,所以我知道在哪里输出它在我的模板中,所以我知道_id:“$ age”不会给我我想要的东西,但是我不' t知道如何得到我想要的东西,或者)。
我唯一见过不止一件事,那是一个$匹配,一个$组和一个$项目。但是如果$ project意味着我不能使用$ sum或$ count,我可以做多个$组,如果可以的话,它有什么窍门?
通过某种方式(第二部分),您似乎在寻找'$ cond',您可以使用它来对逻辑结果进行操作以生成年龄键。但在另一部分,你想要一个“多面的”结果,“性别”和“年龄”的结果在一个响应中。这在一个查询中实现并不是很实际(不完全不可能,但通常是这样),并且通过组合至少两个查询的结果来更好地实现。一个用于性别,一个用于年龄分组。 –
当你说'查询'时,你的意思是两个电话吗?或者我做一个Person.aggregate,获取数据,保存到结果集,然后做第二个Person.aggregate? (我实际上并没有想到如何将数据保存到一个我然后执行的集合 - 而不仅仅是.find()。select()。exec() - 但理论上它似乎是可能的。 )或者你的意思是别的吗? – kl02