多个mongoose count()查询到MongoDB

第一:我 – > MongoNoob,我知道这已经被问到了,但是到现在我还没有find任何具体的东西。 比方说,我有两个这样描述的Moongoose模型:

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

用户界面显示投票,当用户select一个选项时,它被写入choiceSchema模型。 现在我想创build一个“统计”,告诉我有多less用户select选项1,选项2,选项3,….我可以简单地获取所有select的查询与查询和生成统计在服务器代码,但如果我有一百万个用户的select,我将不得不处理相同大小的数组。 这不可能是正确的。 然而,我可以生成一个查询,并使用count()方法:

 var query = Choice.find({poll_id: someId}), query.where('option', 1); var resultForOption1; query.count(function(err, count)) { resultForOption1 = count; }); 

我将如何做到这一点多个选项和'join'(哈哈)结果到数组? 由于这是所有asynchronous,我将嵌套的调用,但是这不是一个可选数量的查询。

我错过了树木:-)? 有人能指出我正确的方向吗?

BR,Daniel

你可以使用aggregate来做到这一点:

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

这将按照poll_idoptionchoices集合文档进行poll_id ,并计算每个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 } 

然后,您可以在aggregatepipe道中使用随后的$group$project阶段,以根据需要进一步对所生成的文档进行分组和重新整形。

如果你只是迭代count查询,并做到这一点很容易和干净你可以使用像一个像共同或甚至更好的asynchronous,asynchronous:

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

另一种select – 在我看来更好。 是使用聚合查询 。 你将会学到更多关于mongoDB的知识,并且应该更有效率。 在我发给你的链接中,第一个例子几乎就是你想要做的事情:

询问