首页 > 解决方案 > 计算行数并仅获取 MongoDB 中的最后一行

问题描述

我有一系列帖子如下:

  {
    "author": "Rothfuss",
    "text": "Name of the Wind",
    "likes": 1007,
    "date": ISODate("2013-03-20T11:30:05Z")
  },
  {
    "author": "Rothfuss",
    "text": "Doors of Stone",
    "likes": 1,
    "date": ISODate("2051-03-20T11:30:05Z")
  }

我想计算每个作者的帖子和他/她最后的帖子。这里有同样问题的 SQL 答案。我试图找到它的 MongoDB 替代品。

到目前为止,我结束了这个查询:

db.collection.aggregate([
  {
    "$group": {
      "_id": "$author",
      "count": {
        "$sum": 1
      },
      "lastPost": {
        "$max": {
          "_id": "$date",
          "post": "$text"
        }
      }
    }
  }
])

这似乎有效,但它的不同运行会产生不同的结果。它可以在 Mongo 操场上进行测试。我不明白如何使用$max从包含最大值的文档中选择另一个属性。我是 MongoDB 的新手,所以对基础知识的描述也很受欢迎。

额外的问题

是否可以限制$sum只添加likes超过 100 个的帖子?

标签: mongodbcountaggregation-frameworkmax

解决方案


它的不同运行会产生不同的结果。
我不明白如何使用 $max 从包含最大值的文档中选择另一个属性。

$max不适用于多个字段,并且在具有文本/字符串值的字段中也无效。

它将从一组帖子中选择任何属性,每次都会有所不同。

所以准确的结果你可以在stage$sort之前添加新的stage $group,按日期降序排序,在group stage中你可以通过$first运算符选择一个值,

  { $sort: { date: -1 } },
  {
    $group: {
      _id: "$author",
      count: { $sum: 1 },
      date: { $first: "$date" },
      post: { $first: "$text" }
    }
  }

是否可以限制$sum只添加likes超过 100 个的帖子?

您的要求有两个含义,我不确定您要问的是哪个,但让我给出两个解决方案,

  1. 如果您只是不想计算帖子,count但您想将其作为最后一个帖子datetext如果是的话。
  • $cond检查条件如果likes大于 100 则计数 1 否则计数 0
db.collection.aggregate([
  { $sort: { date: -1 } },
  {
    $group: {
      _id: "$author",
      count: {
        $sum: {
          $cond: [{ $gt: ["$likes", 100] }, 1, 0]
        }
      },
      date: { $first: "$date" },
      post: { $first: "$text" }
    }
  }
])

操场

  1. 如果你不想数数,也不想最后一个帖子,如果是的话。
  • 您可以$match在第一阶段添加一个阶段以检查大于条件,您的最终查询将是,
db.collection.aggregate([
  { $match: { likes: { $gt: 100 } } },
  { $sort: { date: -1 } },
  {
    $group: {
      _id: "$author",
      count: { $sum: 1 },
      date: { $first: "$date" },
      post: { $first: "$text" }
    }
  }
])

操场


推荐阅读