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

Posted

技术标签:

【中文标题】项目,然后在 mongoose 中对数组字段进行排序【英文标题】:Project and then sort in mongoose for array fields 【发布时间】:2022-01-11 21:36:51 【问题描述】:

我有一个猫鼬模型,用于在名为 PostModel 的类似社交媒体的网站上发布帖子:


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

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

问题是它不起作用。这是我尝试过的:

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 
)

此查询没有给出任何错误,但根本没有对结果数组进行排序。因此,可以确认投影实际上是在 mongoose 中排序之后发生的。

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

也许还要检查你的版本,也许它不支持你现在正在尝试做的事情,并且 我不知道为什么,但由于某种原因,它适用于 aggregate() 方法。我尝试了您的解决方案,它对我有用。老实说,这非常奇怪。我在 mongoose 文档中找不到 find() 和 aggregate 之间的区别,说句公道话,一开始的信息量不是很大。 我也已经花了好几个小时诅咒文档,你并不孤单;)

以上是关于项目,然后在 mongoose 中对数组字段进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 先填充,然后根据填充的字段进行过滤

使用 Mongoose.js 按嵌套数组中的字段排序

Java中对JSONArray中的对象的某个字段进行排序

Java中对JSONArray中的对象的某个字段进行排序

如何在 PHP 数组中对格式项目进行编号

如何在Vue中对具有2个字段的数组进行排序?