MongoDB中结合$first与$last操作符的结果处理
嘿,针对你给出的这个MongoDB聚合结果数据集(看起来是按行政区(borough)和菜系(cuisine)分组统计的餐厅数量),我来给你详细讲讲怎么用$first和$last操作符来处理它~
首先得明确:$first和$last这两个操作符的核心作用是,在经过排序后的分组结果里,分别取出分组内的第一个和最后一个文档的数据。重点是「排序」——如果不先排序,MongoDB默认的文档顺序是不确定的,这时候用这两个操作符得到的结果会是随机的,完全不可控。
下面给你两个常见的使用场景,附具体代码:
场景1:按行政区分组,获取每个行政区下首尾菜系的餐厅统计
比如你想知道曼哈顿(Manhattan)下,按菜系字母排序后的第一个和最后一个菜系的餐厅数量,或者按餐厅数量排序后的首尾数据,都可以这么做:
// 假设你的数据集存在名为 restaurant_stats 的集合中 db.restaurant_stats.aggregate([ // 第一步:先指定排序规则,这里按菜系名称升序排列 { $sort: { "_id.cuisine": 1 } }, // 第二步:按行政区分组,提取首尾数据 { $group: { _id: "$_id.borough", // 按行政区作为分组键 firstCuisine: { $first: { cuisine: "$_id.cuisine", restaurantCount: "$RestaruntCount" } }, lastCuisine: { $last: { cuisine: "$_id.cuisine", restaurantCount: "$RestaruntCount" } } } } ])
执行这个聚合后,你会得到每个行政区对应的第一个(字母最靠前)和最后一个(字母最靠后)菜系的餐厅统计数据。如果想按餐厅数量排序,只要把$sort的字段换成RestaruntCount即可,比如{ $sort: { "RestaruntCount": -1 } }就是按数量降序,这时候$first就是该行政区餐厅最多的菜系,$last就是最少的。
场景2:全局获取整个数据集的首尾文档
如果不需要按行政区分组,只想拿到整个数据集里排序后的第一个和最后一个数据(比如餐厅数量最多和最少的条目),可以这样写:
db.restaurant_stats.aggregate([ // 按餐厅数量降序排序,这样第一个就是数量最多的,最后一个是最少的 { $sort: { "RestaruntCount": -1 } }, // 全局分组(_id: null 表示把整个集合作为一个分组) { $group: { _id: null, topRestaurant: { $first: { borough: "$_id.borough", cuisine: "$_id.cuisine", count: "$RestaruntCount" } }, bottomRestaurant: { $last: { borough: "$_id.borough", cuisine: "$_id.cuisine", count: "$RestaruntCount" } } } } ])
关键提醒
- 排序步骤必须放在
$group之前!这是$first和$last能返回预期结果的前提,因为它们依赖分组前的文档顺序。 - 你可以根据业务需求灵活调整排序字段和排序方向(升序
1/降序-1),来得到不同的首尾结果。 - 注意你的数据集里的字段拼写:
RestaruntCount应该是RestaurantCount?如果是笔误,记得在代码里对应修改哦~
内容的提问来源于stack exchange,提问作者FabTrex
相关产品推荐
相关产品推荐

