如何通过findMany查询ID以数组元素结尾的文档?求更优方案
更优实现方案
针对你的需求,不用遍历数组多次调用findFirst,有两种更高效的实现方式,分场景说明:
前端直接处理现有数组
用Array.filter搭配Array.some一次遍历完成匹配,避免多次重复查询操作:
const arr = ['ace', 'acb', 'acc', 'aca']; const documents = [ { id: 'xxxxxxxace' }, { id: 'xxxxxxxacb' }, { id: 'xxxxxxxacc' }, { id: 'xxxxxxxaca' }, { id: 'xxxxxxxyz' } // 测试用不匹配项 ]; // 一次过滤出所有符合条件的文档 const matchedDocs = documents.filter(doc => arr.some(suffix => doc.id.endsWith(suffix)) );
这个方法仅需遍历documents数组一次,每个文档通过some检查是否匹配任意后缀,比循环调用findFirst(每次仅返回单个匹配项,还要重复遍历)效率高得多。
如果后缀数组arr元素较多,可以先按后缀长度倒序排序,优先检查更长的后缀,能提前终止some的判断,进一步优化性能:
// 按后缀长度从长到短排序 const sortedSuffixes = [...arr].sort((a, b) => b.length - a.length); const matchedDocs = documents.filter(doc => sortedSuffixes.some(suffix => doc.id.endsWith(suffix)) );
数据库查询场景(如MongoDB)
如果是从数据库查询文档,直接生成后缀匹配的正则表达式,一次查询即可返回所有结果,避免多次数据库请求:
const arr = ['ace', 'acb', 'acc', 'aca']; // 生成匹配任意后缀结尾的正则 const suffixRegex = new RegExp(`(${arr.join('|')})$`); // MongoDB 查询示例 const matchedDocs = await db.collection('your-collection').find({ id: suffixRegex }).toArray();
正则表达式中的$表示匹配字符串结尾,|分隔多个后缀选项,数据库会一次性完成所有匹配条件的检索,性能远优于多次调用单条件查询。
内容的提问来源于stack exchange,提问作者PYTHON DEVELOPER999
相关产品推荐
相关产品推荐

