집계 파이프 라인을 사용하여 목록의 문자열로 시작하는 문자열이있는 필드가있는 문서를 확인하려면 어떻게해야합니까?

스티브 Storck

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

(그 가치와 함께)

올바른 방향으로 넛지 해 주셔서 미리 감사드립니다.

Valijon

배열 $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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관