如何在MongoDB中高效查询匹配外部字符串数组的子串
MongoDB查询匹配外部字符串数组子串的term值
问题背景
我的MongoDB数据库中有如下结构的文档:
{id:1,term: "Hello how"} {id:2,term: "whoever"} {id:3,term:"what"}
我有一个来自外部源的字符串数组:
["Hello how are you", "whoever has done this please let me know"]
需要编写MongoDB查询,以最快方式找出所有属于该数组中任意字符串子串的term值,预期结果为["Hello how","whoever"]。
现有尝试及问题
我曾尝试用正则表达式:
Hello|how|are|you|whoever|has|done|this|please|let|me|know
对应的查询语句:
db.collection.find({ text: { $regex: /Hello|how|are|you|whoever|has|done|this|please|let|me|know/, $options: 'i' } })
但这个方法只能匹配单个单词,满足不了多词term的子串匹配需求。
补充说明
- 每个term对应独立文档;
- 字符串数组来自外部,每次查询都会变化;
- term需是数组中任意字符串的子串,不要求是前缀。
解决方案
方法一:使用$expr结合$indexOfBytes(MongoDB 3.6+)
这种方式直接通过表达式判断term是否是外部字符串的子串,无需提前创建特殊索引;若数据集较大,建议给term字段建立普通索引提升查询速度。
查询代码示例:
// 外部传入的字符串数组 const externalStrings = ["Hello how are you", "whoever has done this please let me know"]; // 执行查询,仅返回匹配的term字段 db.collection.find({ $expr: { $gt: [ $size({ $filter: { input: externalStrings, cond: { $ne: [{ $indexOfBytes: ["$$this", "$term"] }, -1] } } }), 0 ] } }, { term: 1, _id: 0 })
逻辑说明:遍历外部字符串数组,用$indexOfBytes检查当前文档的term是否是数组中某字符串的子串(返回值不为-1则表示存在),只要有一个匹配就返回该文档。
方法二:动态生成$or条件(适合外部数组长度较短场景)
如果外部字符串数组长度不大,可以为每个字符串生成独立的匹配条件,组合成$or查询:
const externalStrings = ["Hello how are you", "whoever has done this please let me know"]; const matchConditions = externalStrings.map(str => ({ $expr: { $ne: [{ $indexOfBytes: [str, "$term"] }, -1] } })); db.collection.find({ $or: matchConditions }, { term: 1, _id: 0 })
这种方式和方法一逻辑一致,只是写法不同,在数组长度较短时性能差异不大。
内容的提问来源于stack exchange,提问作者Mahes
相关产品推荐
相关产品推荐

