
本文详解如何在 Go 语言中借助 mgo 驱动正确实现 $natural: -1 排序,以高效获取 MongoDB 集合中最新插入的文档,重点解决 Sort("$natural:-1") 失效问题。
本文详解如何在 go 语言中借助 mgo 驱动正确实现 `$natural: -1` 排序,以高效获取 mongodb 集合中最新插入的文档,重点解决 `sort("$natural:-1")` 失效问题。
在 MongoDB 中,$natural 排序可按文档在磁盘上的物理插入顺序(即写入顺序)进行遍历,$natural: -1 表示逆序读取,常用于快速获取最新插入的一条记录(尤其适用于无显式时间戳字段或未建索引的场景)。但在 Go 的 mgo 驱动中,其排序语法与 MongoDB Shell 并不完全一致:mgo 不支持 "$natural:-1" 或 "$natural: -1" 这类字符串形式的复合键值表达式,而是采用前缀符号约定——正向为 $natural,逆向需写为 -$natural。
因此,以下写法是错误的(会导致排序无效或 panic):
// ❌ 错误:mgo 无法解析 "$natural:-1" 字符串
db.C("plays").Find(nil).Sort("$natural:-1").Limit(1).One(&numbs)
// ❌ 错误:含空格或冒号结构均不被 mgo 的 Sort() 方法识别
db.C("plays").Find(nil).Sort("$natural: -1").One(&numbs)
✅ 正确写法如下(注意 - 号直接前置,无空格、无冒号、无花括号):
err := db.C("plays").
Find(nil).
Select(bson.M{"numbers": 1}).
Sort("-$natural"). // ← 关键:使用 "-$natural" 表示 $natural 降序
Limit(1).
One(&numbs)
if err != nil {
log.Fatal("查询失败:", err)
}
⚠️ 注意事项:
-$natural仅在 MongoDB WiredTiger 引擎的集合上行为可靠;MMAPv1 引擎已弃用,不建议使用。$natural排序不利用索引,性能取决于数据量和磁盘局部性,大数据集慎用;生产环境更推荐添加created_at时间字段并建立索引后按该字段排序。- mgo 已归档(官方维护已停止),新项目应迁移到官方驱动
mongo-go-driver,其对应写法为options.Find().SetSort(bson.D{{"$natural", -1}})。
综上,掌握 mgo 的 Sort() 字符串约定(如 "-field" 表示降序、"field" 表示升序、"-$natural" 表示自然逆序)是避免常见查询陷阱的关键。务必以实际测试验证排序结果,例如插入多条带 _id.ObjectIdHex(...) 时间可辨识的文档后比对返回顺序。











