下面是详细的讲解“MongoDB聚合分组取第一条记录的案例与实现方法”的完整攻略。
案例说明
假设我们有一个用户评论的集合(collection),每条评论包含以下字段:
_id
:评论ID。userId
:用户ID。content
:评论内容。createTime
:评论时间。
现在我们需要对所有评论按照用户进行分组,取每个用户的最新评论进行展示。具体实现方法如下。
实现方法
利用MongoDB聚合(Aggregation)管道的 $group
聚合操作符以及 $sort
操作符。
聚合操作符 $group
用于将文档分组,将分组后的文档进行聚合计算。我们这里使用 $group
对评论进行分组,同时 $sort
对评论进行排序,$sort可以按照CreateTime
字段从新到旧进行排序。这样每个组的第一条记录就是最新的记录,我们可以用 $first
操作符来选择每个组的第一条记录。
具体实现步骤如下:
- 先按照
userId
字段对评论集合进行分组,使用$group
进行分组,同时使用$sort
,将评论按照createTime
字段从新到旧排序。
db.comments.aggregate([
{ $sort: { createTime: -1 } },
{ $group: { _id: "$userId", data: { $first: "$$ROOT" } } }
])
- 再使用
$project
操作符将结果中的data
字段提取出来。
db.comments.aggregate([
{ $sort: { createTime: -1 } },
{ $group: { _id: "$userId", data: { $first: "$$ROOT" } } },
{ $project: { _id: 0, userId: "$data.userId", content: "$data.content", createTime: "$data.createTime" } }
])
到此,就能实现将每个用户的最新评论进行展示的功能了。
示例说明
假设我们有一个评论集合comments
,包含以下五条评论数据:
{ "_id" : ObjectId("614b12d0e663718b6079aa3b"), "userId" : "user001", "content" : "这是一条评论", "createTime" : ISODate("2021-09-22T12:00:00.000Z") }
{ "_id" : ObjectId("614b12fce663718b6079aa3c"), "userId" : "user001", "content" : "这是另一条评论", "createTime" : ISODate("2021-09-22T13:00:00.000Z") }
{ "_id" : ObjectId("614b132fe663718b6079aa3d"), "userId" : "user001", "content" : "这是最新的评论", "createTime" : ISODate("2021-09-22T14:00:00.000Z") }
{ "_id" : ObjectId("614b1370e663718b6079aa3e"), "userId" : "user002", "content" : "这是第一条评论", "createTime" : ISODate("2021-09-22T12:00:00.000Z") }
{ "_id" : ObjectId("614b1391e663718b6079aa3f"), "userId" : "user002", "content" : "这是最新的评论", "createTime" : ISODate("2021-09-22T13:00:00.000Z") }
执行聚合操作的代码如下:
db.comments.aggregate([
{ $sort: { createTime: -1 } },
{ $group: { _id: "$userId", data: { $first: "$$ROOT" } } },
{ $project: { _id: 0, userId: "$data.userId", content: "$data.content", createTime: "$data.createTime" } }
])
执行结果为:
{ "userId" : "user001", "content" : "这是最新的评论", "createTime" : ISODate("2021-09-22T14:00:00.000Z") }
{ "userId" : "user002", "content" : "这是最新的评论", "createTime" : ISODate("2021-09-22T13:00:00.000Z") }
我们可以看到,每个用户只展示了最新的一条评论。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MongoDB聚合分组取第一条记录的案例与实现方法 - Python技术站