MongoDB如何查询字段值为指定字符串子串的集合文档
如何在MongoDB中查询字段值为指定字符串子串的文档
要实现你描述的需求——找出集合中某个字段的值是给定长字符串子串的文档,这里有两种实用的方法,我分别给你拆解说明:
方法1:使用$where操作符(简单直观,适合小集合)
$where允许我们用JavaScript表达式编写查询条件,直接判断给定字符串是否包含字段的值。比如你的示例中,给定字符串是'forest',要查询name字段是它子串的文档,可以这么写:
db.yourCollectionName.find({ $where: function() { // 'forest'是你指定的目标字符串,this.name指向文档中的name字段 return 'forest'.includes(this.name); } })
⚠️ 注意:$where会在服务器端执行JavaScript,对于数据量较大的集合来说,它无法利用索引,性能会比较差,所以更适合小数据量的场景。
方法2:使用聚合管道的$indexOfCP操作符(更高效,推荐)
MongoDB的聚合框架提供了$indexOfCP(按Unicode代码点查找)或$indexOfBytes(按字节查找)操作符,可以返回子串在目标字符串中的位置;如果找不到子串,会返回-1。我们可以利用这个特性来筛选符合条件的文档:
db.yourCollectionName.aggregate([ { $match: { $expr: { // 判断$name在'forest'中的位置不等于-1,说明是子串 $ne: [ { $indexOfCP: ['forest', '$name'] }, -1 ] } } } ])
扩展:忽略大小写匹配
如果需要忽略大小写的子串匹配,只需要用$toLower把目标字符串和字段值都转成小写即可:
db.yourCollectionName.aggregate([ { $match: { $expr: { $ne: [ { $indexOfCP: [{ $toLower: 'forest' }, { $toLower: '$name' }] }, -1 ] } } } ])
用上面的查询,你的示例集合中{id: 1, name: 'est'}会被匹配返回,而{id: 2, name: 'ab'}会被过滤掉,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Ergi Laze




