programing

$in을 사용한 대소문자 구분 안 함 검색

mailnote 2023. 7. 15. 10:27
반응형

$in을 사용한 대소문자 구분 안 함 검색

다음을 사용하여 mongodb의 컬렉션에서 열을 검색하는 방법$in검색을 위한 요소들의 배열을 포함하고 또한.caseInsensitive열에 있는 요소들의 일치?

대소문자를 구분하지 않고 $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 } } );

이것도 모두 $에 효과가 있습니다.

이것이 도움이 되길 바랍니다!

p.s.: 이것이 웹 애플리케이션에서 태그로 검색하는 저의 솔루션이었습니다.

$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"]
   }
]

이것은 저에게 딱 맞습니다.

코드에서 다음과 같은 사용자 지정 쿼리를 만들 수 있습니다.

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

쿼리 후 mongo에서 다음으로 변환됩니다.

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

"$nin"도 마찬가지입니다.

이것은 꽤 간단합니다.

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

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

여기 제가 사용한 배열의 데이터에서 여러 조건(정규식)을 가진 케이스 인센시티브 검색(쿼리)이 있습니다.$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' }
        } 
      }
    ]
})

언급URL : https://stackoverflow.com/questions/10700921/case-insensitive-search-with-in

반응형