데이터베이스 마스터링 - 중첩 레코드 액세스 - 시리즈 #10

소개



지난 시리즈에서 우리는 문서의 무작위 샘플을 검색했습니다.
그것은 매우 간단했습니다. 본질적으로 oneliner.

그러나 앱에서 외부 수준 문서의 하위 문서로 존재하는 항목의 임의 샘플을 선택하고 싶었다고 가정해 보겠습니다.

사실 별로 어렵지 않습니다.
그리고 우리는 루프를 사용하지 않습니다.
그 대신에 우리는 "긴장을 풀다", 또는 당신이 그것을 우리 문서의 "평평하게 하는"것으로 생각할 수 있습니다.

아티스트에 앨범이 있는 경우 각 아티스트 문서에는 하위 문서가 있습니다.

아티스트의 앨범에 각각 한 개의 노래가 포함되어 있으면 한 개의 하위 문서가 있는 문서가 있고 그 하위 문서에도 여러 개의 하위 문서가 있습니다.

외부 문서의 데이터 모양은 다음과 같습니다.

/*
data shape:
 {
    "artist": "Julian Lennon",
    "albums": [
      {
        "albumTitle": "Valotte (1984)",
        "albumSongs": [
          {
            "song": "Valotte"
          },
          {
            "song": "O.K. for You"
          },
          {
            "song": "On the Phone"
//....
*/


다음은 임의의 노래 세트(이 경우 5개)를 선택하는 쿼리입니다.

  mgArr(dbEnum.nlpdb, collEnum.songsColl,
    unwindArr("albums"),
    unwindArr("albums.albumSongs"),
    randomSample(5),
    projectIncludeNoId("artist", "albums.albumSongs.song"),
  )


무작위로 다섯 곡을 소개합니다.
노래를 연주한 사람을 확인할 수 있도록 아티스트를 포함했습니다.

/*
output:

[
  {
    "artist": "Miley Cyrus",
    "albums": {
      "albumSongs": {
        "song": "Girls Just Wanna Have Fun"
      }
    }
  },
  {
    "artist": "Creedence Clearwater Revival",
    "albums": {
      "albumSongs": {
        "song": "Penthouse Pauper"
      }
    }
  },
  {
    "artist": "Judas Priest",
    "albums": {
      "albumSongs": {
        "song": "Out In The Cold"
      }
    }
  },
  {
    "artist": "Akon",
    "albums": {
      "albumSongs": {
        "song": "Throw Dat"
      }
    }
  },
  {
    "artist": "Nazareth",
    "albums": {
      "albumSongs": {
        "song": "Hit The Fan"
      }
    }
  }
]
*/



메모



1.
unwindArr은 $unwind 단계 연산자를 둘러싼 래퍼 함수입니다.
래퍼는 코드를 더 깔끔하게 보이게 하며 일반적으로 하나의 라이너입니다.

export const unwindArr = k => ({ $unwind: "$" + k });


2.
바깥쪽 arr을 풀어야 하고 다음으로 안쪽 arr를 풀어야 합니다. arr이 더 있으면 계속 진행할 수 있습니다. 예를 들어, 각 노래에는 여러 명의 작곡가가 있을 수 있습니다.

삼.
모든 노래가 풀리면 $sample 스테이지 연산자를 사용하여 임의의 샘플을 가져올 수 있습니다.
RandomSample 래퍼는 간단한 oneliner입니다.

export const randomSample = lim => ({ $sample: { size: lim } });


4.
네스트 arrs에 대한 경로를 표현하기 위해 unwind 함수의 점 표기법에 주목하십시오.

5.
마지막으로 표시를 쉽게 하기 위해 두 필드만 "투영"합니다. 내 래퍼 기능인 "NoId"변형은 기본 키를 제외합니다. 테스트용으로만 이 변형을 사용합니다.
원시 $project 구문은 다음과 같습니다(0은 제외, 1은 포함을 의미).

{ $project: { _id: 0, artist: 1, "albums.albumSongs.song": 1 } },


6.
또한 편리하게 MongoDB 집계 함수에 대한 호출과 함께 래퍼 함수 또는 원시 MongoDB 단계 구문을 교체하고 사용할 수 있다는 점에 유의하십시오. 이는 래퍼 함수가 파이프라인의 각 단계에서 단순히 원시 구문을 반환하기 때문입니다.

자원



https://docs.mongodb.com/manual/reference/operator/aggregation/unwind

https://docs.mongodb.com/manual/reference/operator/aggregation/sample

좋은 웹페이지 즐겨찾기