mongodb 原生查询无法直接“先取最新再反转顺序”,但可通过两步实现:先按 `creation_date` 降序查出最新 20 条,再在 php 层升序重排以获得「最新→最旧」的展示顺序。
在 MongoDB 中,sort 参数决定的是查询时数据在游标中的初始顺序,而 limit 是在该排序结果上截取前 N 条。因此:
✅ 正确解法是:先用降序获取真正的最新 20 条,再在 PHP 中反转数组顺序:
// 步骤 1:查询最新的 20 条(按 creation_date 降序)
$options = [
'limit' => 20,
'sort' => ['creation_date' => -1]
];
$result = $db->find(['_id' => new \MongoDB\BSON\ObjectID($group_id)], $options);
// 步骤 2:转换为数组并反转(使「最新」排在最后,「次新」倒数第二…)
$records = iterator_to_array($result); // ⚠️ 注意:必须转为数组才能使用 array_reverse
$reversedRecords = array_reverse($records);? 关键注意事项:
符串 vs DateTime 对象)导致解析失败;而 array_reverse() 更安全、高效、语义清晰。? 进阶建议:若数据量大且频繁需要「最新 N 条 + 倒序展示」,可考虑在应用层缓存翻转结果,或在写入时额外维护一个 reverse_rank 字段用于二次排序——但对绝大多数场景,array_reverse(iterator_to_array($cursor)) 已足够简洁可靠。