这是我的示例文档:
{
"_id" : ObjectId("5eac6572fe57d55a258e645a"),
"createdAt" : ISODate("2020-05-01T18:07:37.568Z"),
"user" : ObjectId("5e6dda081c456d3670ba5816"),
"question" : [
{
"round" : 1,
"attempt" : 1,
"right" : 0,
"wrong" : 1,
"time" : ISODate("2020-05-01T18:07:46.900Z"),
"_id" : ObjectId("5eac6572fe57d55a258e645b"),
"questions" : ObjectId("5e81735b286698630dba2be5")
}
],
"__v" : 0
}
我想按 createdAt 分组并计算该日期的问题总数。我试过这个,但没有运气
MyModel.aggregate([
{ $match: { user: req.user._id } },
{
$group: {
_id: {
createdAt: "$createdAt",
//question: "$question",
//count: {$count: "$question"} // Giving me an error that $count not found
}
},
}
], function(err, docs) {
if (err) {
console.log(err);
} else {
res.json(docs);
}
});
任何帮助将不胜感激。提前致谢!
尝试以下聚合查询:
db.collection.aggregate([
/** add a new field to each doc with count on `question` array */
{ $addFields: { questionCount: { $size: "$question" } }
},
/** group all docs & sum-up question count */
{
$group: {
_id: { createdAt: { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } } },
questionCount: { $sum: "$questionCount" }
}
}
])
测试: mongoplayground
注意:您当然可以通过在数组$unwind
之后作为第二阶段使用,然后通过计算 no.of docs来以其他方式执行此操作,但如果即使之后它仍然很大,也可能会爆炸您的集合,所以这种方式可能会更好。$match
question
$group
$unwind
$match
更新:正如@Thee Sritabtim 所建议的:
db.collection.aggregate([
/** group all docs & sum-up question count using `$size` on array */
{
$group: {
_id: { createdAt: { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } } },
questionCount: { $sum: { $size: "$question" } }
}
}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句