You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动