MongoDB 쿼리 결과를 임시 데이터베이스에 저장하기
MongoDB에서 쿼리 실행 결과를 별도의 임시 컬렉션에 저장해야 하는 경우가 종종 있습니다. 이럴 때 forEach() 메서드를 활용하면 단일 쿼리만으로 조회 결과를 다른 컬렉션에 손쉽게 복사할 수 있습니다.
먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.demo43.insertOne({"StudentName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e25d4b3cfb11e5c34d898e5")
}
> db.demo43.insertOne({"StudentName":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e25d4b8cfb11e5c34d898e6")
}
> db.demo43.insertOne({"StudentName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e25d4bbcfb11e5c34d898e7")
}find()로 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo43.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e25d4b3cfb11e5c34d898e5"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5e25d4b8cfb11e5c34d898e6"), "StudentName" : "Bob" }
{ "_id" : ObjectId("5e25d4bbcfb11e5c34d898e7"), "StudentName" : "David" }forEach()로 쿼리 결과를 임시 컬렉션에 저장하기
이제 핵심 부분입니다. find()로 조회한 각 문서를 forEach() 함수로 순회하면서 새로운 컬렉션(demo44)에 하나씩 삽입하면 됩니다.
> db.demo43.find().forEach(function(myDocument) { db.demo44.insert(myDocument); } )이 쿼리는 demo43 컬렉션의 모든 문서를 순차적으로 읽어 demo44라는 임시 컬렉션에 그대로 저장합니다. 참고로 대상 컬렉션이 존재하지 않으면 MongoDB가 자동으로 생성해 주므로 별도의 사전 작업이 필요하지 않습니다.
저장된 결과 확인
새 컬렉션에 데이터가 제대로 저장되었는지 find() 메서드로 확인해 보겠습니다.
> db.demo44.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e25d4b3cfb11e5c34d898e5"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5e25d4b8cfb11e5c34d898e6"), "StudentName" : "Bob" }
{ "_id" : ObjectId("5e25d4bbcfb11e5c34d898e7"), "StudentName" : "David" }정리
이처럼 forEach()와 함께 콜백 함수에서 insert를 호출하면 조회 결과 전체를 다른 컬렉션으로 간단히 복사할 수 있습니다. 다만 대량의 데이터를 다룰 때는 성능을 위해 $out 또는 $merge 집계 연산자를 사용하는 것이 더 효율적이라는 점도 함께 기억해 두면 좋습니다.