MongoDB查询时排序字段为int类型和string类型的区别

最近在开发中遇到一个mongo查询排序的问题,项目中一些高频访问的热数据是放在mongoDB里的,mongo支持很多像SQL一样的操作比如sort就对应于SQL的order by.

比方我们有一个集合来存放一些书籍信息,集合中有下面这些文档

{
    "_id" : "28041",
    "title" : "Mysql入门",
    "subtitle" : "",
    "author" : "John Joe",
    "cate_id" : "223",
    "list_order" : "10",
}
......

{
    "_id" : "28847",
    "title" : "Node即学即用",
    "subtitle" : "",
    "author" : "Mike Wilson",
    "cate_id" : "223",
    "list_order" : "6",
}

上面集合中的list_order字段是用来控制书籍信息在列表中的现实顺序的,比方要查询cate_id 223下的所有书籍,并且把查询结果按list_order降序排列。

db.book.find({"cate_id" : "223"}).sort({"list_order" : -1});
但查询出来的写过却并不是预想的list_order为10的文档排在前面,结果正好相反。原因就是上面的集合中list_order的字段值都是字符串。

由于平常用Mysql比较多所以在查询时自然想到ORDER BY list_order DESC, 但是MongoDB并不能按照数字来排序字符串字段值,上面的集合中如果通过排序字符串值来得到想要的结果需要在个位数字前面补“0” 01,02,03,04,05,06,07,08,09,10,11 这样才能返回想要的排序结果。

另外也可以将list_order的值存储为整数类型

{
    "_id" : "28847",
    "title" : "Node即学即用",
    "subtitle" : "",
    "author" : "Mike Wilson",
    "cate_id" : "223",
    "list_order" : NumberLong(6),
}

同样能得到倒序排列结果。

推荐采用第二种存储整型数值的方法,另外需要注意一些数据是从Mysql查出然后放到Mongo里去的,Mysql中存储的int字段值查询到程序里会变成数字字符串即 6 ==> "6" 所以才有了上面list_order值为"6"的情况, 所以如果需要保存为整型的数据,在save前都要用(int)来进行类型转换。


网管叨bi叨
公众号:网管叨bi叨 | Golang、PHP、Laravel、Docker等学习经验分享
5k 声望
1.5k 粉丝
0 条评论
推荐阅读
线上Go项目的Docker镜像应该怎么构建?
Go开发的程序在编译成二进制文件后是可以在没有安装Go环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是Kubernetes的实践所以镜像方面就没有占...

Kevin1阅读 5k

Mongodb-关联表查询
之前使用SQL语法来查询oracle、sqlserver、mysql表之间的关联,但是到mongodb之后完全无从下手,写法完全不一样,于是到网上查询mongodb关联表查询的写法,于是参考代码自己试着写了下,但是发现有好多问题,比如...

Awbeci2阅读 4.6k评论 1

(学习到实践)七、mongodb测试,php+nginx负载均衡的部署
从测试容器中匹配搜索得到 mongod.conf.orig,设置可以启动,网上查找配置项反不能启动,原因是配置是yaml格式!好像听说过。百度查询得到:官方配置说明,网站卡得出奇。

沧浪水阅读 2.9k

MongoDB安装、启动、关闭、授权
安装参考[链接]配置文件 {代码...} 启动MongoDB {代码...} MongoDB的关闭方式kill进程模式(不建议使用) {代码...} 自带模式 {代码...} 注意: mongod进程收到SIGINT或SIGTERM信号,会做一些处理 切忌使用kill -9...

YYGP阅读 1.3k

mongoShake基于go实践应用
通过阿里云自研的MongoShake开源工具,您可以实现MongoDB数据库间的数据同步,该功能可用于数据分析、灾备和多活等业务场景。本文以云数据库MongoDB实例间的数据实时同步为例介绍配置流程。

金闽阅读 1k

如何正确地使用 Docker 在云服务器上部署 MongoDB v6 数据库并连接
使用 Docker 部署 MongoDB 时,容器默认不会自动生成 mongod.conf 配置文件,需要开发者手动映射云服务器上的配置文件至容器内部,因此,我们需要先创建一份配置文件,您可以任意选择该文件的存储目录,这里我们...

libinfs阅读 698

封面图
MongoDB的索引事物和高可用分析
collection集合,相当于SQL中的表(table),一个集合可以存放多个文档(行)。不同之处就在于集合的结构(schema)是动态的,不需要预先声明一个严格的表结构。更重要的是,默认情况下 MongoDB并不会对写入的数据做任...

djjk阅读 550

5k 声望
1.5k 粉丝
宣传栏