mongodb 查询排序 分页出现重复
正在做一个项目,有一个需求:文章列表按评论数排序并获取分页。
然后肯定先通过管道关联表->然后再将统计这个数据的长度然后再通过得到的这个长度进行降序排序,然后skip跳过指定行,再通过limit 得到指定行
获取第一页 排序正常一切正常
获取第二页 前几个感觉正常,然后开始出现和第一页重复的数据
Schema.static('findAeticleByNav_id', async function ({
nav_id,
tag_id,
limit = 10,
skip = 0,
order
} = {}) {
const $match_article = {}
const $match_tag = {}
let $sort = {
'like_size': -1
};
if (order === 0) {
$sort = {
'like_size': -1
}
} else if (order === 1) {
$sort = {
_id: -1
}
} else if (order === 2) {
$sort = {
'comments_size': -1
}
}
console.log($sort);
nav_id && ($match_article.nav_id = mongoose.Types.ObjectId(nav_id));
tag_id && ($match_tag['tagmap.tag_id'] = mongoose.Types.ObjectId(tag_id))
return await this.aggregate([
{
$project: {
content: 0,
updated: 0,
_v: 0,
}
},
{
$match: {
...$match_article,
}
},
{
$lookup: { // 左连接
from: "users",
localField: "user_id",
foreignField: "_id",
as: "user"
}
},
{
$unwind: { // 拆分子数组
path: "$user",
preserveNullAndEmptyArrays: true // 空的数组也拆分
}
},
{
$lookup: { // 左连接
from: "navs",
localField: "nav_id",
foreignField: "_id",
as: "nav"
}
},
{
$unwind: { // 拆分子数组
path: "$nav",
preserveNullAndEmptyArrays: true // 空的数组也拆分
}
},
// 标签映射
{
$lookup: { // 左连接
from: "tagmaps",
localField: "_id",
foreignField: "article_id",
as: "tagmap"
}
},
// 标签
{
$lookup: { // 左连接
from: "tags",
localField: "tagmap.tag_id",
foreignField: "_id",
as: "tags"
}
},
{
$match: {
...$match_tag
}
},
// 喜欢
{
$lookup: { // 左连接
from: "likes",
localField: "_id",
foreignField: "article_id",
as: "likes"
}
},
// 评论
{
$lookup: { // 左连接
from: "comments",
localField: "_id",
foreignField: "article_id",
as: "comments"
}
},
{
$project: {
_id: 1,
title: 1,
date: 1,
user: 1,
nav: 1,
tags: 1,
user_id: 1,
likes: 1,
comments: 1,
like_size: {
$size: "$likes"
},
comments_size: {
$size: "$comments"
}
}
},
{
$sort: {
...$sort,
_id: -1
// // 'like_size': -1,
// comments_size: -1
} // 不固定
},
// {
// $skip: skip // 不固定
// },
// {
// $limit: limit // 不固定
// }
]).skip(skip).limit(limit);
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
sort需要存在_id作为兜底排序