请问mongodb能不能根据首字母来取出所有姓名是该字母开头的用户列表?
发布于 2年前 作者 shinka 1691 次浏览

后台存储用户姓名用了英文名和中文名两种,我想写一个API是根据首字母,起始位置,返回数目来得到用户列表,但现在遇到的问题是后台mongoose的时候,怎样能通过传入的首字母来取出那些中文名中首字母是该字母的用户列表呢? 比如函数:getUserList("T", 1, 20) 表示以T字母开头的,排序后从第一条开始取20条数据,返回这20个用户对象列表。后台该怎么写数据库查询语句呢? 谢谢

6 回复

我大概尝试了很长时间,也没有试出用什么实现会比较简单,如果单纯的提取中文的拼音首字母倒是可以,mongoose的Query对象的$where也提供mongodb的原生查询方法,我记得mongodb权威指南上说是允许向数据库添加类似于sql数据库的存储过程一样的函数function,然后$where就可以写调用数据库函数的语句来实现查询了,分页使用的limit和skip。 不知道其他大神有什么更新更好的方式。

另外,我又有一个想法,就是以前在写extjs的时候,grid默认是没有中文排序的,需要手动加入一段代码,给grid重写一个中文排序的算法。其中运用到String.localeCompare()方法,具体api查看参考手册http://www.w3school.com.cn/js/jsref_localeCompare.asp。 然后我的想法是,拼音以T为首的,肯定有一个是“头”,假设是“他”,因此,你可以这样

//伪代码
Query
    .$where('xxx.toString().localeCompare(“他”) &gte; 0')
    .limit()
    .skip()
    .exec(callback);

当然,“他”不一定是T的头,需要找一下,但是怎么找的,我也不是很清除,如果你知道,麻烦也告诉我们,以上就是一种想法吧。

我昨天看到过一篇文章 localeCompare不支持chrome(应该说实现的方式不同) 这个让人很蛋疼啊 试了一下确实结果和IE等不一样 可能还有些浏览器不支持这个 其他方法我能想到的也就是找js库来辅助解决这个问题 实在不行用java事先把用户的中文名转成拼音然后存入mongodb中user模型中的某个属性 单纯判断首字母似乎解决不了问题 比如ta tou这种 ta就应该排在tou的前面 所以还是得知道拼音全部啊… 有点麻烦

@shinka xxx.toString().localeCompare(“他”) &gte; 0 是js代码,这句代码是运行在数据库端的,跟浏览器无关,你先试一试能不能用,这你考虑浏览器做什么呢?

@a272121742 Nodejs不是用的v8引擎嘛,所以不得不考虑chrome对localeCompare的实现,早上我都在装虚拟机,还没去研究这函数。我估计node端对localeCompare的实现也是得到两个字符串Unicode码的差值而不是0,1,-1这些值

@shinka 大哥,是数据库端比较的,不是nodejs,也不是浏览器…

回到顶部