Как искать столбец в коллекции в MongoDB с $in
который включает в себя множество элементов для поиска и также caseInsensitive
согласования этих элементов в столбце?
Нечувствительный к регистру поиск с помощью $in
Ответ 1
Вы можете использовать $ elemMatch с поиском по регулярным выражениям, например, позвольте искать " синий " цвет в следующей коллекции:
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
Используйте $ 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 } } );
Это работает за все $ тоже.
Надеюсь, это поможет!
PS: Это было мое решение для поиска по тегам в веб-приложении.
Ответ 3
Это работает для меня отлично.
Из кода мы можем создать собственный запрос следующим образом:
{
"first_name":{
"$in":[
{"$regex":"^serina$","$options":"i"},
{"$regex":"^andreW$","$options":"i"}
]
}
}
Это преобразуется в следующее в монго после запроса:
db.mycollection.find({"first_name":{"$in":[/^serina$/i, /^andreW$/i]}})
То же самое для "$ nin".
Ответ 4
Вот мой нечувствительный к регистру поиск (запрос) с множественным условием (регулярным выражением) из данных массива, я использовал $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' }
}
}
]
})
Ответ 5
Это довольно просто
const sampleData = [
RegExp("^" + 'girl' + "$", 'i'),
RegExp("^" + 'boy' + "$", 'i')
];
const filerObj = { gender : {$in : sampleData}};
Ответ 6
Способ сделать это в 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);