mongo 서버 버전 3.4를 사용하고 있으므로 내 질문은 해당 버전의 기능과 관련이 있습니다. 곧 업그레이드 할 수 없으므로 명심하십시오. MongoDB 컬렉션의 일부 문서에 문자열이 포함될 수 있지만 후행 문자도있는 필드가있는 경우 동일한 쿼리에서 평가할 여러 "startsWith"문자열을 제출할 때 어떻게 찾을 수 있습니까? 설명하는 데 어려움이있을 수 있으므로 몇 가지 예를 보여 드리겠습니다. 모든 문서에 "설명"이라는 필드가 있다고 가정 해 보겠습니다. 이 설명은 텍스트가 완전히 단순하지 않도록 인코딩 될 수 있습니다. 일부 값은 다음과 같습니다.
green:A-4_ABC
yellow:C-12_456
red:A-431_ZXCVQ
yellow_green:C-12_999
brown:B-3_R
gray:EN-44_195
편집 : 내 키에 단어를 사용하는 데 실수를 한 것 같습니다. 키는 숫자, 문자 및 밑줄의 무작위 문자열, 콜론, 1 ~ 3 개의 문자, 대시, 숫자, 밑줄, 마지막으로 여러 영숫자 문자가 차례로 표시됩니다.
LKEF543SLI54EH2J897FQ_HF234EWOH:ZX-82_FR2
나는 이것이 임의적이고 어리석은 것처럼 들리지만 고유 키를 생성하기위한 정보의 인코딩이라는 것을 알고 있습니다. 내가받은 데이터에 있기 때문에 불행히도 변경할 수 없습니다.
이제 다음 값 중 하나로 시작하는 설명이있는 모든 문서를 찾고 싶습니다. 이러한 모든 값은 동일한 쿼리로 제출되어야합니다. 제출 된 값이 수백 개일 수 있으며 일치하는 모든 문서를 한 번에 가져와야합니다. 다음은 단일 쿼리로 제출할 수있는 항목의 짧은 목록입니다.
green:A-4
red:A-431
gray:EN-44
yellow_green:C-12
텍스트가 마지막 이전의 모든 텍스트라는 것은 우연이 아닙니다.밑줄. 그리고 예제 중 하나와 마찬가지로 밑줄이 두 개 이상있을 수 있습니다. 내 사용 사례에서는 이러한 문자열을 javascript regex 형식으로 하드 코딩하는 쿼리를 만들 수 없습니다. 그리고 $ in 필터는 특히 문자열 목록을 전달할 때 "startsWith"기능에서 작동하지 않습니다 (하드 코딩 된 자바 스크립트 정규식 목록을 제공하는 데 익숙하지만). 이와 같은 쿼리를 실행하려는 사용자로부터 전달 된 문자열 목록을 가져올 수있는 $ in 연산자를 사용하는 방법이 있습니까? 아니면 동등한 것이 있습니까? 이 모든 것의 가장 중요한 부분은 일치하는 문자열과 일치하는 문서를 투영하는 방법을 찾는 것입니다 (쿼리에서 또는 내가 알아낼 수없는 일부 하위 문자열 마법에 의해).
편집 : 특히, 각 문서를 찾을 때 다음과 같이 마지막 밑줄까지 키에서 모든 것을 투영 할 수 있기를 원합니다.
LKEF543SLI54EH2J897FQ_HF234EWOH:ZX-82
(그 가치와 함께)
올바른 방향으로 넛지 해 주셔서 미리 감사드립니다.
배열 $objectToArray
을 얻기 위해 사용 합니다 {k:field_name, v:field_value}
. 그런 다음 _
모든 값 을 토큰으로 분할 하고 $arrayToObject
연산자 를 사용하여 객체로 변환합니다 .
다음 단계에서는 $match
연산자를 적용 하여 문서를 필터링 data
하고 $unset
.
참고 : 문서에 배열 또는 하위 문서가 포함 된 경우 $filter
변환하기 전에 사용할 수 있습니다 $objectToArray
.
db.collection.aggregate([
{
$addFields: {
data: {
$arrayToObject: {
$map: {
input: {
$objectToArray: "$$ROOT"
},
in: {
k: "$$this.k",
v: {
$arrayElemAt: [
{
$split: [
{
$toString: "$$this.v"
},
"_"
]
},
0
]
}
}
}
}
}
}
},
{
$match: {
"data.green": "A-4",
"data.red": "A-431",
"data.gray": "EN-44",
"data.yellow_green": "C-12"
}
},
{
$unset: "data"
}
])
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다