首先:我 -> 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()
方法:
var query = Choice.find({poll_id: someId}),
query.where('option', 1);
var resultForOption1;
query.count(function(err, count)) {
resultForOption1 = count;
});
我如何为多个选项执行此操作并将结果“加入”(哈哈)到一个数组中?由于这都是异步的,我会嵌套调用,但这不是可变数量查询的选项。
我是否只见树木不见森林:-)?有人能指出我正确的方向吗?
BR, 丹尼尔
最佳答案
你可以使用聚合
来做到这一点:
Choice.aggregate(
{$group: {_id: {poll_id: '$poll_id', option: '$option'}, count: {$sum: 1}}}
).exec(...);
这将按 poll_id
和 option
对 choices
集合文档进行分组,并计算每个的出现次数,输出如下所示:
{
"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
}
然后,您可以在 aggregate
管道中使用后续的 $group
和 $project
阶段,根据需要进一步分组和 reshape 生成的文档。
关于javascript - 对 MongoDB 的多个 mongoose count() 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20653351/