【问题标题】:MongoDB - Most Recent Item for Each ID in ListMongoDB - 列表中每个 ID 的最新项目
【发布时间】:2021-08-02 16:55:28
【问题描述】:

我有一个内容 ID 列表,我正在尝试获取列表中每个内容 ID 的最新评论(如果存在) -

我的查询如下所示:

const query = [
   { 
      $match: { 
         content_id: { $in: myContentIds }, 
      }, 
   }, 
   { $sort: { ‘comment_created’: -1 } }, 
]

const results = await collection.find(query).toArray();

我的理解是,这将获取与myContentIds 数组中的 contentIds 相关的所有 cmets,并根据日期按降序对它们进行排序。

然后我可以使用 { $limit: 1} 限制我的结果,但这将返回对任何内容项的最新评论,而不是每个内容的最新评论。

如何修改我的查询以返回我的每个内容项的最新评论?

【问题讨论】:

  • 您能否展示示例文档和预期结果。
  • 评论将有一个content_id 和一个comment_created 日期字段。 myContentIds 将是一个 id 数组,例如 [1,3,5,82]。预期结果是一个 cmets 数组,例如:[{comment_id: 123, content_id: 3, comment_created: ‘2020-12-10T09:21:48.861Z}, {comment_id: 1256, content_id: 5, comment_created: ‘2020-11-10T09:31:48.861Z}]

标签: javascript node.js mongodb mongodb-query


【解决方案1】:
  • $group by content_id 并获取第一个最近的文档
  • $replaceRoot 替换根目录中的最近文档(这是可选的,您可以按对象使用文档recentComment
const query = [
  { $match: { content_id: { $in: myContentIds } } },
  { $sort: { comment_created: -1 } },
  {
    $group: {
      _id: "$content_id",
      recentComment: { $first: "$$ROOT" }
    }
  },
  { $replaceRoot: { newRoot: "$recentComment" } }
];

const results = await collection.aggregate(query);

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多