Javascript 对MongoDB的多个mongoose count()查询

Javascript 对MongoDB的多个mongoose count()查询,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,首先:me->MongoNoob,我知道已经有人以这样或那样的方式问过这个问题,但直到现在我还没有找到任何具体的问题。 假设我有两个月光鹅模型,描述如下: var pollSchema = mongoose.Schema({ title: String, choices: [{ content: String }] }); var choiceSchema = mongoose.Schema({ poll_id: mongoose.Schema.O

首先:me->MongoNoob,我知道已经有人以这样或那样的方式问过这个问题,但直到现在我还没有找到任何具体的问题。 假设我有两个月光鹅模型,描述如下:

var pollSchema = mongoose.Schema({
    title: String,
    choices: [{
        content: String
    }]
});
var choiceSchema = mongoose.Schema({
    poll_id: mongoose.Schema.ObjectId,
    option: Number
});
用户界面显示投票,当用户选择一个选项时,它会写入
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;
});
我该如何为多个选项执行此操作,并将结果“连接”(哈哈)到一个数组中?因为这都是异步的,所以我会嵌套调用,但对于数量可变的查询来说,这不是一个选项

我是不是因为树木而怀念森林?谁能给我指一下正确的方向吗

比尔,
Daniel

如果您只想迭代
计数
查询,并轻松、干净地完成查询,您可以使用类似lib或更好的异步:

async.map({ "option":1 },{ "option":2 }], Choice.find, function(e, r){
    // And you continue from here
});
另一个选择——在我看来更好。就是使用。您将了解更多关于mongoDB的信息,并且应该更加高效。在我发送给您的链接中,第一个示例几乎就是您想要做的:



(来源:)

您可以使用
aggregate
执行此操作:

Choice.aggregate(
    {$group: {_id: {poll_id: '$poll_id', option: '$option'}, count: {$sum: 1}}}
).exec(...);
这将按
poll\u id
选项对
选项
收集文档进行分组,并统计每个选项的出现次数,给出如下输出:

{
  "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
$project
阶段,根据需要进一步对生成的文档进行分组和重塑。

我建议您创建一个文档,记录聚合结果并存储这些值,而不是尝试实时计算它们。非常感谢。这确实起到了作用,让我进入了新的领域。:-)