MongoDB의 $literal 연산자를 사용하면 집계(aggregation) 작업 중에 특정 필드의 값을 고정된 문자열 리터럴로 교체할 수 있습니다. 일반적으로 집계 표현식에서 문자열은 필드 경로로 해석되지만, $literal을 사용하면 입력한 값 그대로 상수로 처리됩니다.
1. 샘플 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.replacevaluedemo.insertOne({"StudentName":"Chris","StudentFavouriteSubject":{"TeacherName":"Bob","SubjectCode":"MySQL111"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0390a3f5e889d7a51994fd")
}
> db.replacevaluedemo.insertOne({"StudentName":"Mike","StudentFavouriteSubject":{"TeacherName":"David","SubjectCode":"3221Java"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0390b8f5e889d7a51994fe")
}2. 컬렉션의 모든 문서 조회
find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 확인하는 쿼리는 다음과 같습니다.
> db.replacevaluedemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e0390a3f5e889d7a51994fd"),
"StudentName" : "Chris",
"StudentFavouriteSubject" : {
"TeacherName" : "Bob",
"SubjectCode" : "MySQL111"
}
}
{
"_id" : ObjectId("5e0390b8f5e889d7a51994fe"),
"StudentName" : "Mike",
"StudentFavouriteSubject" : {
"TeacherName" : "David",
"SubjectCode" : "3221Java"
}
}3. $literal을 사용해 문자열 리터럴로 값 교체
이제 집계 파이프라인의 $project 단계와 함께 $literal을 사용하여 TeacherName 필드의 값을 문자열 리터럴 "UNKNOWN NAME"으로 교체해 보겠습니다.
> db.replacevaluedemo.aggregate([{
... "$project": {
... "_id": 1,
... "StudentFavouriteSubject": {
... SubjectCode: 1,
... TeacherName: { $literal: "UNKNOWN NAME" }
... }
... }
... }]).pretty();위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e0390a3f5e889d7a51994fd"),
"StudentFavouriteSubject" : {
"SubjectCode" : "MySQL111",
"TeacherName" : "UNKNOWN NAME"
}
}
{
"_id" : ObjectId("5e0390b8f5e889d7a51994fe"),
"StudentFavouriteSubject" : {
"SubjectCode" : "3221Java",
"TeacherName" : "UNKNOWN NAME"
}
}정리
출력 결과를 보면 두 문서 모두 TeacherName 필드의 기존 값(Bob, David)이 사라지고, $literal로 지정한 고정 문자열 "UNKNOWN NAME"으로 대체된 것을 확인할 수 있습니다. 반면 SubjectCode는 원래 값 그대로 유지됩니다. 이처럼 $literal은 집계 과정에서 필드 값을 미리 정의된 상수 값으로 바꾸고 싶을 때 매우 유용하게 활용할 수 있습니다.