0

所以我需要返回一个主题集合,每个主题都有一个“mostRecentThree”属性,其中包含 3 个最新帖子

我有 2 个收藏

话题

{name:'food', foo:bar}

邮政

{ topic:'food', created: someDate }

返回结果应该是设置了 recentThree 属性的集合

{name:food, recentThree: [postId1, postId2, postId3], foo:bar}

这样做最有效的方法是什么?

4

1 回答 1

0

我这么晚才回答,这对其他人有帮助,

aggregate()与管道一起使用,

  • $lookup阶段添加了一个新的数组字段,其元素是“加入”集合中的匹配文档,并且$llokup 与 agregation pipeline指定要在加入集合上运行的管道。管道从连接的集合中确定生成的文档。
  • 我们要加入post收藏
  • $match topicname表达式使用$exprand$eq
  • $sort按日期降序(-1)顺序,表示最新的将在前
  • $limit获取已在上述管道中排序的前 3 条记录
db.topic.aggregate([
  {
    $lookup: {
      from: "post",
      as: "recentThree",
      let: { name: "$name" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$topic", "$$name"] }
          }
        },
        { $sort: { created: -1 } },
        { $limit: 3 }
      ]
    }
  }
])

游乐场:https ://mongoplayground.net/p/_QXjhk-Qxg4

于 2020-08-08T20:32:00.143 回答