You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在MongoDB中按topicId分组后获取最新非自身发布的帖子?

解决思路与正确查询语句

我来帮你搞定这个需求!你要找的是最新回复不是你自己的主题,核心是得先按主题分组,拿到每个主题下的最新回复信息,再筛选出回复者不是你的那些主题。你之前的查询只全局取了一条最新的非自己消息,完全没按主题分组,这就是达不到目的的原因。

正确的聚合查询方案

用MongoDB的聚合框架来实现,步骤清晰可靠:

db.messages.aggregate([
  // 第一步:先按主题分组排序,确保每个主题下最新的消息排在最前面
  { $sort: { topicId: 1, timestamp: -1 } },
  // 第二步:按topicId分组,提取每组的最新回复者和时间
  {
    $group: {
      _id: "$topicId",
      latestUser: { $first: "$user" },
      latestTimestamp: { $first: "$timestamp" }
    }
  },
  // 第三步:筛选出最新回复不是自己的主题
  { $match: { latestUser: { $ne: "myUserId" } } },
  // 可选:只保留需要的字段,让结果更简洁
  { $project: { _id: 1, latestTimestamp: 1 } }
])

每一步的作用解释:

  • $sort:先按topicId升序排列,同一个主题下再按timestamp降序排列,这样每个主题的最新回复会排在该主题分组的最顶端。
  • $group:以topicId为分组依据,用$first提取每组第一条数据的usertimestamp——也就是该主题的最新回复者和回复时间。
  • $match:过滤掉最新回复者是你自己的主题,剩下的就是有他人新回复的主题。
  • $project:可选步骤,如果你只需要主题ID和最新回复时间,用这个阶段精简输出结果。

为什么不用你原来的查询?

你之前的find语句只是从所有非你发布的消息里取了最新的一条,完全没有按主题维度分组,根本无法判断每个主题的最新回复情况,自然满足不了需求。

内容的提问来源于stack exchange,提问作者user3142695

火山引擎 最新活动