【问题标题】:Multiple mongoose count() queries to a MongoDB对 MongoDB 的多个 mongoose count() 查询
【发布时间】:2019-09-10 13:08:09
【问题描述】:

首先:我 -> MongoNoob 我知道这已经被以一种或另一种方式提出过,但直到现在我还没有找到任何具体的东西。 假设我有两个这样描述的 Moongoose 模型:

var pollSchema = mongoose.Schema({
    title: String,
    choices: [{
        content: String
    }]
});
var choiceSchema = mongoose.Schema({
    poll_id: mongoose.Schema.ObjectId,
    option: Number
});

用户界面显示投票,当用户选择一个选项时,它会被写入choiceSchemamodel。现在我想创建一个“统计数据”,告诉我有多少用户选择了选项 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, 丹尼尔

【问题讨论】:

  • 我建议您创建一个记录汇总结果并存储值的文档,而不是尝试实时计算它们。

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

Choice.aggregate(
    {$group: {_id: {poll_id: '$poll_id', option: '$option'}, count: {$sum: 1}}}
).exec(...);

这会将choices 集合文档按poll_idoption 分组,并计算每个文档的出现次数,输出如下所示:

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

【讨论】:

  • 非常感谢。这确实起到了作用,让我进入了新的领域。 :-)
【解决方案2】:

如果您只想遍历 count 查询并使其简单而干净,您可以使用像 co 这样的库,甚至更好,异步:

async.map({ "option":1 },{ "option":2 }], Choice.find, function(e, r){
    // And you continue from here
});

另一种选择-在我看来更好-。是使用aggregate queries。您将了解有关 mongoDB 的更多信息,并且应该更有效率。在我发送给您的链接中,第一个示例几乎就是您想要做的:


(来源:mongodb.org

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2021-11-06
    • 2014-10-10
    • 2012-11-14
    • 2017-10-01
    • 2014-05-13
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多