You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:30:21