Angular中MongoDB正则查询如何优先返回最匹配的结果?
嗨,这个问题我之前也碰到过~原因很简单:你当前的查询只是过滤出了以输入词开头的文档,但MongoDB默认会按文档在集合里的自然存储顺序返回结果,完全没考虑匹配度或者字符串长度,所以才会出现长词汇排在前面的情况。
要让最接近的结果(比如输入Bie时的Bier)排在首位,我们需要按词汇长度升序排序——毕竟前缀匹配的前提下,长度越短的词汇和输入的term越接近。这里得用MongoDB的聚合框架来实现,因为普通的find没法直接基于字段长度排序。
修改后的代码如下:
getSuggestions(term: string) { const regex = new stitch.BSON.BSONRegExp(`^${term}`, 'i'); return from(this.words.aggregate([ // 第一步:过滤出以输入词开头的词汇 { $match: { 'Noun': { $regex: regex } } }, // 第二步:临时添加一个字段,存储词汇的长度 { $addFields: { nounLength: { $strLenCP: '$Noun' } } }, // 第三步:先按长度升序排(短的在前),长度相同的话按词汇本身升序排 { $sort: { nounLength: 1, 'Noun': 1 } }, // 第四步:去掉临时添加的长度字段,避免返回冗余数据 { $project: { nounLength: 0 } } ]).execute()); }
简单解释下关键部分:
$strLenCP:用来计算字符串的Unicode字符长度(如果你的词汇都是纯ASCII,用$strLenBytes也可以,但$strLenCP兼容性更强)。- 排序规则:先按
nounLength升序,确保短词汇优先;再按Noun本身升序,处理长度相同的词汇(比如输入Bi时,Bier和Bild会按字母顺序排列)。
这样修改后,输入Bie时,Bier就会排在最前面,长词汇会靠后啦~
内容的提问来源于stack exchange,提问作者gog
相关产品推荐
相关产品推荐

