多个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_id
和option
对choices
集合文档进行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 }
然后,您可以在aggregate
pipe道中使用随后的$group
和$project
阶段,以根据需要进一步对所生成的文档进行分组和重新整形。
如果你只是迭代count
查询,并做到这一点很容易和干净你可以使用像一个像共同或甚至更好的asynchronous,asynchronous:
async.map({ "option":1 },{ "option":2 }], Choice.find, function(e, r){ // And you continue from here });
另一种select – 在我看来更好。 是使用聚合查询 。 你将会学到更多关于mongoDB的知识,并且应该更有效率。 在我发给你的链接中,第一个例子几乎就是你想要做的事情: