项目场景:
场景:数据按mtime或ctime排序查询,返回前端数据过滤status, mtime, ctime问题描述:
$sort写在$project后,可能会出现$sort指定字段被$project过滤,导致排序结果出错const PROJ: any = { status: 0, ctime: 0, mtime: 0 }
/**
* 未指定任何查询参数
* @param offset 偏移量
* @param limit 返回的rows.length
* @returns total, rows
*/
async function searchByNothing<T extends string[]>(offset: number, limit: number, order: T) {
const sql = { status: DataStatus.normal }
const total = await db.roomsCollection.countDocuments(sql)
const rows = await db.roomsCollection.aggregate([
{ $match: sql },
{ $project: PROJ },
{ $sort: getSortSql(order) },
{ $skip: offset },
{ $limit: limit }
]).toArray()
return { total, rows }
}
原因分析:
$sort写在$project后,可能会出现$sort指定字段被$project过滤,导致排序结果出错解决方案:
sort必须在sort必须在sort必须在project前</>
const PROJ: any = { status: 0, ctime: 0, mtime: 0 }
/**
* 未指定任何查询参数
* @param offset 偏移量
* @param limit 返回的rows.length
* @returns total, rows
*/
async function searchByNothing<T extends string[]>(offset: number, limit: number, order: T) {
const sql = { status: DataStatus.normal }
const total = await db.roomsCollection.countDocuments(sql)
// sort必须在project前,否则sort指定的字段可能会被project过滤
const rows = await db.roomsCollection.aggregate([
{ $match: sql },
{ $sort: getSortSql(order) },
{ $project: PROJ },
{ $skip: offset },
{ $limit: limit }
]).toArray()
return { total, rows }
}
本文介绍了在使用MongoDB时遇到的关于$sort与$project操作顺序导致的排序问题,详细描述了项目场景、问题现象,并深入分析了问题产生的原因。最后,提供了解决这一排序错误的方案。
1213

被折叠的 条评论
为什么被折叠?



