使用$in进行大小写不敏感的搜索

28

如何在 MongoDB 中使用 $in 操作符搜索包含待查找元素数组的集合列,并进行不区分大小写(caseInsensitive)匹配?


除了$in运算符外,这与https://dev59.com/ZHI-5IYBdhLWcg3wbHq-是重复的。 - Mick Sear
没错,我的问题基本上与使用$in运算符进行不区分大小写匹配有关。 - Onkar Janwa
你可以使用 $caseSensitive: false。请参考此处:https://docs.mongodb.com/manual/reference/operator/query/text/index.html - Praveen
6个回答

17
使用 $in,匹配不区分大小写:
数据示例:
{ 
    name : "...Event A",
    fieldX : "aAa" 
},
{ 
  name : "...Event B",
  fieldX : "Bab" 
},
{ 
  name : "...Event C",
  fieldX : "ccC" 
},
{ 
  name : "...Event D",
  fieldX : "dDd" 
}

我们希望在数组(optValues)的任何值中包含“fieldX”字段的文档:

var optValues = ['aaa', 'bbb', 'ccc', 'ddd'];

var optRegexp = [];
optValues.forEach(function(opt){
        optRegexp.push(  new RegExp(opt, "i") );
});

db.collection.find( { fieldX: { $in: optRegexp } } );

这对于任何$all都有效。

希望这能帮到你!

p.s.: 这是我在一个Web应用程序中按标签搜索的解决方案。


为了Ruby的需要也工作得很好,谢谢。只需使用Regexp.new(opt, Regexp::IGNORECASE)代替new RegExp(tag, "i")即可。 - Flo Woo
在Java或Spring mongodbTemplete中运行此示例的Java代码将是什么? - GoutamS
1
可以简化为 var optRegexp = optValues.map(value => new RegExp("^" + value + "$", "i"); 以便与 { $in: optRegexp } 一起使用。 - j3ff

15
你可以使用$elemMatch与正则表达式搜索,例如在以下集合中搜索"blue"颜色:
db.items.save({ 
  name : 'a toy', 
  colors : ['red', 'BLUE'] 
})
> ok
db.items.find({
  'colors': {
    $elemMatch: { 
      $regex: 'blue', 
      $options: 'i' 
    }
  }
})
>[ 
  {   
    "name": "someitem",
    "_id": { "$oid": "4fbb7809cc93742e0d073aef"},   
    "colors": ["red", "BLUE"]
   }
]

2
一个注意点:这个正则表达式不会使用索引。因此,这种解决方案不适用于“大数据”。另一种解决方案是支持相同的小写数组。 - Andrew Orsich
确实。谢谢你提到这个。 - Zaur Nasibov
7
当我们需要检查一个数组的值时,这并不实用。 - Sai Ram

4
这对我来说完美地起作用。
我们可以从代码中创建自定义查询,例如:
{
  "first_name":{
    "$in":[
      {"$regex":"^serina$","$options":"i"}, 
      {"$regex":"^andreW$","$options":"i"}
    ]
  }
}

查询后,此内容将在Mongo中转换为以下内容:
db.mycollection.find({"first_name":{"$in":[/^serina$/i, /^andreW$/i]}})

同样适用于"$nin"。

2
最初的回答
这很简单。
const sampleData = [
  RegExp("^" + 'girl' + "$", 'i'),
  RegExp("^" + 'boy' + "$", 'i')
];
const filerObj = { gender : {$in : sampleData}};

1

在Java中实现的方法是:

List<String> nameList = Arrays.asList(name.split(PATTERN));
List<Pattern> regexList = new ArrayList<>();
for(String name: nameList) {
regexList.add(Pattern.compile(name , Pattern.CASE_INSENSITIVE));
}
criteria.where("Reference_Path").in(regexList);

0
这是我的不区分大小写的搜索(查询),它具有来自数组数据的多个条件(正则表达式)。我使用了$in,但它不支持不区分大小写的搜索。
示例数据
{ 
  name : "...Event A",
  tags : ["tag1", "tag2", "tag3", "tag4] 
},
{ 
  name : "...Event B",
  tags : ["tag3", "tag2"]
},
{ 
  name : "...Event C",
  tags : ["tag1", "tag4"]
},
{ 
  name : "...Event D",
  tags : ["tag2", "tag4"]
}

我的查询

db.event.find(
  { $or: //use $and or $or depends on your needs
    [ 
      { tags : { 
         $elemMatch : { $regex : '^tag1$', $options : 'i' }
        } 
      },
      { tags : { 
         $elemMatch : { $regex : '^tag3$', $options : 'i' }
        } 
      }
    ]
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接