项目,然后在 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 中对数组字段进行排序的主要内容,如果未能解决你的问题,请参考以下文章