Case insensitive search with $ in

时间:2012-05-22 11:14:30

标签: mongodb nosql

他们以任何方式搜索mongodb中的一个集合中的列,其中包含一个用于搜索的元素数组以及列中这些元素的caseInsensitive匹配吗?

6 个答案:

答案 0 :(得分:9)

你可以使用$ 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" ]   }
 ]

答案 1 :(得分:8)

使用匹配不区分大小写的$in

数据示例:

{ 
    name : "...Event A",
    fieldX : "aAa" 
},
{ 
  name : "...Event B",
  fieldX : "Bab" 
},
{ 
  name : "...Event C",
  fieldX : "ccC" 
},
{ 
  name : "...Event D",
  fieldX : "dDd" 
}

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

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应用程序中按标签搜索的解决方案。

答案 2 :(得分:1)

这完全适合我: 从代码中我们可以创建这样的自定义查询:

{"first_name":{"$in":[{"$regex":"^serina$","$options":"i"},{"$regex":"^andreW$","$options":"i"}]}}

这将在查询后转换为mongo中的以下内容:

db.mycollection.find({"first_name":{"$in":[/^serina$/i, /^andreW$/i]}})

同样适用于" $ nin"。

答案 3 :(得分: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' }
        } 
      }
    ]
})

答案 4 :(得分:0)

这很简单

const sampleData = [
  RegExp("^" + 'girl' + "$", 'i'),
  RegExp("^" + 'boy' + "$", 'i')
];
const filerObj = { gender : {$in : sampleData}};

答案 5 :(得分:0)

用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);