【发布时间】:2015-12-15 12:40:49
【问题描述】:
现在我已经在 $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 我不想要 1517191919 或其他的 id,我想要一个可靠的名字所以我知道在我的模板中将它输出到哪里。所以我知道 _id: "$age" 不会给我我想要的东西,但我也不知道如何得到我想要的东西。)
我唯一一次看到不止一个东西,那就是 $match、$group 和 $project。但是如果 $project 意味着我不能使用 $sum 或 $count,我可以做多个 $groups,如果可以,它的诀窍是什么?
【问题讨论】:
-
在某种程度上(第二部分)您似乎在寻找
$cond,您可以使用它来处理逻辑结果以生成您的年龄密钥。但在另一部分,你想要一个“多面”的结果,“性别”和“年龄”的分组结果都是一个响应。在一个查询中实现这并不是很实际(并非完全不可能,但通常如此),并且通过组合至少两个查询的结果来更好地服务。一种用于性别,一种用于年龄组。 -
当你说'查询'时,你的意思是两个电话吗?还是我做一个 Person.aggregate,获取该数据,保存到结果集,然后再做一个 Person.aggregate? (我实际上还没有想出如何将数据保存到我然后执行的集合中 - 而不仅仅是 .find().select().exec() - 但理论上它似乎是可能的。 ) 还是你的意思是别的?
标签: node.js mongodb mongoose mongodb-query aggregation-framework