【发布时间】:2022-09-23 16:22:36
【问题描述】:
我正在尝试使用相同的聚合管道获取聚合,包括来自多个集合的 $match 和 $group 操作。
例如,
带有users 集合和questions、answers 和comments 的集合,其中每个文档都有authorId 和created_at 字段,
db = [
\'users\': [{ _id: 123 }, { _id: 456} ],
\'questions\': [
{ authorId: ObjectId(\'123\'), createdAt: ISODate(\'2022-09-01T00:00:00Z\') },
{ authorId: ObjectId(\'456\'), createdAt: ISODate(\'2022-09-05T00:00:00Z\') },
],
\'answers\': [
{ authorId: ObjectId(\'123\'), createdAt: ISODate(\'2022-09-05T08:00:00Z\') },
{ authorId: ObjectId(\'456\'), createdAt: ISODate(\'2022-09-01T08:00:00Z\') },
],
\'comments\': [
{ authorId: ObjectId(\'123\'), createdAt: ISODate(\'2022-09-01T16:00:00Z\') },
{ authorId: ObjectId(\'456\'), createdAt: ISODate(\'2022-09-05T16:00:00Z\') },
],
]
我想从每个集合中获取文档计数,其中created_at 在给定范围之间并按authorId 分组。
所需的聚合结果可能如下所示。这里的_ids 是users 集合中文档的ObjectId。
\\\\ match: { createdAt: { $gt: ISODate(\'2022-09-03T00:00:00Z) } }
[
{ _id: ObjectId(\'123\'), questionCount: 0, answerCount: 1, commentCount: 0 },
{ _id: ObjectId(\'456\'), questionCount: 1, answerCount: 0, commentCount: 1 }
]
目前,我在下面为每个集合运行聚合,结合后端服务中的结果。 (我正在使用 Spring Data MongoDB Reactive。)这似乎非常低效。
db.collection.aggregate([
{ $match: {
created_at: { $gt: ISODate(\'2022-09-03T00:00:00Z\') }
}},
{ $group : {
_id: \'$authorId\',
count: {$sum: 1}
}}
])
如何通过一次聚合获得所需的结果?
我认为$unionWith 或$lookup 可能会有所帮助,但我被困在这里。
标签: mongodb mongodb-query aggregation-framework spring-data-mongodb spring-data-mongodb-reactive