问题
有一张user表, 其有name, age, …等字段, 现在的要求是: 按name模糊搜索(正则匹配) , 然后分页输出.
构造数据
为了说明问题, 构造数据, 无关字段省略, 只保留name, age字段方便观察:
function genName(base, n) {
var res = [];
var suffix = 0;
for (var i = 0; i < n; i++) {
suffix = parseInt(Math.random() * n) % (n / 10)
res.push(base + suffix);
}
return res;
}
var names = genName("zhangsan", 1000)
for (var i = 0, len = names.length; i < len; i++) {
db.user.insert({
name: names[i], // "zhangsan{0,99}"
age: 10 + parseInt(Math.random() * 25),
})
}
复现问题
如果根据用户输入, 按name进行模糊搜索(正则查询), 且要分页, 是这样的:
问题分析
上述问题, 可以简单通过将分页参数$limit调大, 来临时解决, 但是这总不是一定能搜到.
实际上我们需要的是: 将最接近搜索内容的文档排到最前边
那么什么是最接近, 可能有很多标准, 这里列两个比较常用的:
- 完全相等
- 如果没有完全相等的, 则将以搜索内容为前缀的文档排在前边(如zhangsan9x, zhangsanxx这样排序)
问题解决
(完)