项目,然后在 mongoose 中对数组字段进行排序

Project and then sort in mongoose for array fields

我在一个名为 PostModel 的类似社交媒体的网站上有一个 post 的猫鼬模型:

{
caption: String,
likes: [] // array to store info about users who liked the video, basically a ref to a different model
comments: [] // array to store comment objects
}

我想根据喜欢的数量对查找查询中的所有视频进行排序,这里是“喜欢”数组的长度。如果两个 post 的点赞数相同,我想按评论数排序,否则按“评论”数组的长度排序。

问题是它不工作。这是我试过的:

PostModel.find({}, {
  likes: { $size: "$likes" },
  comments: { $size: "$comments" }
}, 
{
  sort: { likes: -1, comments: -1 } // gives "cannot sort with keys that are parallel arrays" error
})

这让我相信排序发生在投影之前。为了确认,我尝试了以下查询:

PostModel.find({}, {
  _l: { $size: "$likes" },
  _c: { $size: "$comments" }
}, 
{
  sort: { _l: -1, _c: -1 }
})

这个查询没有给出任何错误,但是根本没有对结果数组进行排序。所以,确认投影确实发生在猫鼬排序之后。

在这种情况下,我应该如何根据点赞数和评论数对结果数组进行排序?

我尝试了这种聚合,它对我来说非常适合你的数据:

PostModel.aggregate([
  {
    '$set': {
      'likes': {
        '$size': '$likes'
      }, 
      'comments': {
        '$size': '$comments'
      }
    }
  }, {
    '$sort': {
      'likes': -1, 
      'comments': -1
    }
  }
])

我使用 Mongo compass 程序构建了这个聚合,它可以让您通过逐步构建实时查看聚合的工作情况。