Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB의 모든 컬렉션을 순회하며 쿼리를 실행하는 방법

MongoDB에서 데이터베이스에 존재하는 모든 컬렉션을 한 번에 순회(iterate)하면서 쿼리를 실행해야 하는 경우가 종종 있습니다. 예를 들어 각 컬렉션에서 가장 최근에 삽입된 문서의 타임스탬프를 확인하고 싶을 때 유용합니다. 이 글에서는 그 방법을 단계별로 살펴보겠습니다.

1단계: getCollectionNames()로 컬렉션 목록 가져오기

가장 먼저 해야 할 일은 getCollectionNames() 메서드를 사용하여 현재 데이터베이스의 모든 컬렉션 이름 목록을 가져오는 것입니다. 이 메서드는 데이터베이스 내 컬렉션 이름들을 배열 형태로 반환합니다.

2단계: forEach()로 모든 컬렉션 순회하기

컬렉션 이름 목록을 확보했다면, forEach() 함수를 사용하여 각 컬렉션을 순회하며 원하는 쿼리를 실행할 수 있습니다. 여기서는 데이터베이스 이름이 "test"라고 가정하고, 각 컬렉션에서 _id 기준으로 가장 최신 문서 하나를 조회한 뒤 해당 문서의 생성 시간(타임스탬프)을 출력하는 예제를 살펴보겠습니다.

> db.getCollectionNames().forEach(function(collectioNameDemo)
... {
   ... var nextDemo = db[(collectioNameDemo) ].find().sort({_id:-1}).limit(1);
   ... if (nextDemo.hasNext())
   ... {
      ... printjson(nextDemo.next()._id.getTimestamp());
   ... }
... });

코드 설명

  • getCollectionNames().forEach(): 데이터베이스의 모든 컬렉션 이름을 하나씩 순회합니다.
  • find().sort({_id:-1}).limit(1): 각 컬렉션에서 _id 값을 내림차순으로 정렬하여 가장 최근에 생성된 문서 하나만 가져옵니다. ObjectId에는 생성 시간 정보가 포함되어 있으므로, 이 정렬 방식으로 최신 문서를 효과적으로 찾을 수 있습니다.
  • hasNext(): 컬렉션에 문서가 존재하는지 확인합니다. 빈 컬렉션일 경우 오류 없이 건너뜁니다.
  • _id.getTimestamp(): ObjectId에서 문서가 생성된 실제 날짜와 시간을 ISODate 형식으로 추출하여 출력합니다.

실행 결과

위 쿼리를 실행하면 각 컬렉션의 최신 문서 생성 시간이 아래와 같이 출력됩니다.

ISODate("2019-02-21T18:52:43Z")
ISODate("2019-03-19T17:49:00Z")
ISODate("2019-03-06T15:40:12Z")
ISODate("2019-03-15T16:31:50Z")
ISODate("2019-02-21T15:40:52Z")
ISODate("2019-03-06T06:14:37Z")
ISODate("2019-02-21T19:29:15Z")
ISODate("2019-03-15T13:35:33Z")
ISODate("2019-03-14T21:13:58Z")
ISODate("2019-03-18T22:02:54Z")
ISODate("2019-03-22T18:01:45Z")
ISODate("2019-03-06T16:21:14Z")
ISODate("2019-02-20T15:04:32Z")
ISODate("2019-03-06T07:45:42Z")
ISODate("2019-03-19T12:33:17Z")
ISODate("2019-03-20T21:39:21Z")
ISODate("2019-03-15T16:44:26Z")
ISODate("2019-03-22T06:20:45Z")
ISODate("2019-02-21T16:40:55Z")
ISODate("2019-02-21T12:45:20Z")
ISODate("2019-03-06T16:05:48Z")
ISODate("2019-03-06T16:00:08Z")
ISODate("2019-02-28T12:43:56Z")
ISODate("2019-03-20T22:11:41Z")
ISODate("2019-03-06T05:56:45Z")
ISODate("2019-03-06T07:34:12Z")
ISODate("2019-03-14T21:00:16Z")
ISODate("2019-02-28T10:33:39Z")
ISODate("2019-03-06T05:11:10Z")
ISODate("2019-02-28T09:44:28Z")
ISODate("2019-03-06T10:13:22Z")
ISODate("2019-03-17T21:35:26Z")

마무리

이처럼 getCollectionNames()forEach()를 조합하면 MongoDB 셸에서 별도의 스크립트나 외부 도구 없이도 데이터베이스 전체 컬렉션을 손쉽게 순회하며 원하는 쿼리를 실행할 수 있습니다. 이 기법은 컬렉션별 데이터 상태 점검, 통계 수집, 대량 업데이트 작업 등 다양한 관리 작업에 활용할 수 있으니 꼭 익혀두시기 바랍니다.