第一:我 -> MongoNoob,我知道这已经以一种或另一种方式被问过,但到目前为止我还没有发现任何具体内容。
假设我有两个 Moongoose 模型,描述如下:
var pollSchema = mongoose.Schema({
title: String,
choices: [{
content: String
}]
});
var choiceSchema = mongoose.Schema({
poll_id: mongoose.Schema.ObjectId,
option: Number
});
UI 显示民意调查,当用户选择一个选项时,它会被写入choiceSchema
模型。现在我想创建一个“统计数据”,告诉我有多少用户选择了选项 1、选项 2、选项 3,......
我可以简单地获取民意调查的所有选择find
并在服务器代码中生成统计信息,但如果我有一百万个用户选择,我将不得不处理相同大小的数组。这不可能是正确的。
不过,我可以生成一个查询并使用count()
method:
var query = Choice.find({poll_id: someId}),
query.where('option', 1);
var resultForOption1;
query.count(function(err, count)) {
resultForOption1 = count;
});
我该如何对多个选项执行此操作并将结果“连接”(哈哈)到数组中?由于这都是异步的,因此我会嵌套调用,但这对于可变数量的查询来说不是一个选项。
我是不是只见树木不见森林:-)?有人能指出我正确的方向吗?
BR,
丹尼尔
您可以使用aggregate
去做这个:
Choice.aggregate(
{$group: {_id: {poll_id: '$poll_id', option: '$option'}, count: {$sum: 1}}}
).exec(...);
这将把choices
集合文档由poll_id
and option
并计算每个出现的次数,给出如下所示的输出:
{
"result": [
{
"_id": {
"poll_id": 2,
"option": 3
},
"count": 1
},
{
"_id": {
"poll_id": 1,
"option": 2
},
"count": 2
},
{
"_id": {
"poll_id": 2,
"option": 2
},
"count": 1
},
{
"_id": {
"poll_id": 1,
"option": 1
},
"count": 1
}
],
"ok": 1
}
然后就可以使用后续的$group
and $project
你的阶段aggregate
根据需要进一步分组和重塑生成的文档的管道。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)