javascript - 对 MongoDB 的多个 mongoose count() 查询

标签 javascript node.js mongodb mongoose

首先:我 -> 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_idoptionchoices 集合文档进行分组,并计算每个的出现次数,输出如下所示:

{
  "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/

相关文章:

javascript - 使用 Meteor 中的 Javascript 事件在多个预设字段之间切换 MongoDB 文档

javascript - 如何通过 javascript 单击 html 链接访问 SDcard ..?

mongodb - 使用golang mgo查询日期范围之间的mongodb日期

javascript - 将对象从 SQL 查询函数传递到单独的函数

javascript - Sequelize 包含嵌套列 : Unknown column in 'where clause'

node.js - 将node.js代码封装在函数中

javascript - 使用 Socket.io 和 Node.js 进行倒数计时器广播

node.js - 仅返回文档中匹配的对象

javascript - 我无法使用 JavaScript 在我的平方计算器中 console.log 使用 addEventListener 按下的键?

javascript - Angular:无法识别来自共享模块的组件