MongoDB에서 쿼리 결과(단일 문서)를 변수에 저장하기
MongoDB 셸(mongo shell)에서 작업하다 보면 쿼리 결과로 반환된 단일 문서를 변수에 저장한 뒤 재사용해야 하는 경우가 자주 있습니다. 이럴 때 var 키워드를 사용하면 아주 간단하게 해결할 수 있습니다.
기본 문법은 다음과 같습니다.
var anyVariableName = db.yourCollectionName.find().limit(1); anyVariableName; // 저장된 문서 출력
find() 메서드는 기본적으로 여러 문서를 반환할 수 있으므로, limit(1)을 함께 사용하여 첫 번째 문서 하나만 가져오도록 제한하는 것이 핵심입니다.
1단계: 샘플 컬렉션 생성
먼저 실습에 사용할 문서들이 담긴 컬렉션을 생성해 보겠습니다.
> db.storeQueryResultDemo.insertOne({"ClientName":"Chris","ClientAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ecf8fd628fa4220163b8d")
}
> db.storeQueryResultDemo.insertOne({"ClientName":"Robert","ClientAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ecf97d628fa4220163b8e")
}
> db.storeQueryResultDemo.insertOne({"ClientName":"Sam","ClientAge":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ecf9ed628fa4220163b8f")
}
> db.storeQueryResultDemo.insertOne({"ClientName":"Mike","ClientAge":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ecfa8d628fa4220163b90")
}2단계: 전체 문서 조회
다음은 find() 메서드를 사용하여 컬렉션의 모든 문서를 조회하는 쿼리입니다.
> db.storeQueryResultDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5c9ecf8fd628fa4220163b8d"),
"ClientName" : "Chris",
"ClientAge" : 23
}
{
"_id" : ObjectId("5c9ecf97d628fa4220163b8e"),
"ClientName" : "Robert",
"ClientAge" : 21
}
{
"_id" : ObjectId("5c9ecf9ed628fa4220163b8f"),
"ClientName" : "Sam",
"ClientAge" : 25
}
{
"_id" : ObjectId("5c9ecfa8d628fa4220163b90"),
"ClientName" : "Mike",
"ClientAge" : 26
}3단계: 쿼리 결과를 변수에 저장
이제 쿼리 결과(단일 문서)를 변수에 저장하는 쿼리입니다.
> var queryResult = db.storeQueryResultDemo.find().limit(1);
저장된 변수의 내용을 확인하려면 변수 이름만 입력하면 됩니다.
> queryResult;
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c9ecf8fd628fa4220163b8d"), "ClientName" : "Chris", "ClientAge" : 23 }참고: findOne()을 활용한 대안
find().limit(1) 대신 findOne() 메서드를 사용하면 커서가 아닌 문서 자체가 직접 반환되므로, 변수에 필드 값에 바로 접근할 수 있다는 장점이 있습니다.
> var doc = db.storeQueryResultDemo.findOne(); > doc.ClientName; Chris
커서 형태(find().limit(1))로 저장하면 반복 처리나 추가 연산에 유리하고, findOne()으로 저장하면 특정 필드 값을 즉시 읽어오기에 편리합니다. 용도에 맞게 선택하여 사용하시면 됩니다.