Mongoose中的自定义排序

2g32fytz  于 2023-01-05  发布在  Go
关注(0)|答案(1)|浏览(248)

我有以下的故事图式:

story : {
  content: string,
  seenBy: Types.ObjectId[]
}

这里seenBy是用户阵列,
现在我有了一个故事列表,我想根据某个特定登录用户最先看到的故事和最后看到的故事对列表进行排序,
意味着如果登录的userid为2,则seenBy中具有特定userid的故事应排在最后,其他故事应排在前面。
我不知道该怎么做。
在我登录userid的API中,
我尝试了以下方法,但它给出了编译时错误:

const totalStories = await this.Story.find({})
      .populate(this.populateStory())
      .sort({ seenBy: (val) => {
          return val.includes(userid) ? -1 : 1
       }, updatedAt: 'desc' });

我搜索了许多地方,但没有得到任何与我的问题陈述有关的东西。
先谢谢你

8dtrkrch

8dtrkrch1#

经过一番研究,我想出了一个解决办法,
使用聚合函数可以将字段临时添加到文档中,我们可以按如下方式对该字段进行排序:

const totalStories = await this.Story.aggregate([
  {
    $addFields: {
      seen: { $in: [authUser.id, '$seenBy'] },
    },
  },
]).sort({ seen: 'asc', updatedAt: 'desc' });

这样,我们就可以使用任何自定义逻辑进行排序,因为字段seen将是基于文档中数据的布尔值。
我从下面的链接得到的想法:MongoDB ($addField)
prop :
1.您可以编写自定义逻辑(条件)并相应地进行排序。
1.因为它是一个查询,所以会给出乐观的复杂性,而不是数组上的sort()函数。
缺点:
1.由于聚合,无法填充()(注意:作为替代方法,您可以使用$lookup(作为连接)填充数据MongoDB ($lookup)

相关问题