MongoDB에서 특정 검색 조건에 일치하는 문서 중 가장 마지막에 삽입된 문서만 업데이트하고 싶다면 findAndModify() 메서드를 활용하면 됩니다. 이 메서드는 정렬 옵션과 함께 사용해 조건에 맞는 여러 문서 중 하나만 선택적으로 수정할 수 있다는 장점이 있습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo516.insertOne({"Name":"John","Age":22,"Score":56});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e889fdb987b6e0e9d18f591")
}
> db.demo516.insertOne({"Name":"John","Age":23,"Score":67});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e889ff1987b6e0e9d18f592")
}
> db.demo516.insertOne({"Name":"John","Age":22,"Score":56});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e889ff3987b6e0e9d18f593")
}
> db.demo516.insertOne({"Name":"John","Age":22,"Score":66});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e889ffa987b6e0e9d18f594")
}2. find()로 전체 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo516.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e889fdb987b6e0e9d18f591"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ff1987b6e0e9d18f592"), "Name" : "John", "Age" : 23, "Score" : 67 }
{ "_id" : ObjectId("5e889ff3987b6e0e9d18f593"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ffa987b6e0e9d18f594"), "Name" : "John", "Age" : 22, "Score" : 66 }3. findAndModify()로 마지막 문서 업데이트
이제 검색 조건(Name이 "John"이고 Age가 22)에 해당하는 문서 중 _id 기준 내림차순 정렬 시 첫 번째, 즉 가장 나중에 삽입된 문서의 Score 값을 98로 변경해 보겠습니다.
> db.demo516.findAndModify({
... query: {Name: "John", Age: 22},
... sort: {_id: -1},
... update: {$set: {Score: 98}},
... new: true
... })
{
"_id" : ObjectId("5e889ffa987b6e0e9d18f594"),
"Name" : "John",
"Age" : 22,
"Score" : 98
}주요 옵션 설명
- query: 업데이트 대상을 찾기 위한 검색 조건입니다.
- sort: 조건에 일치하는 여러 문서 중 어떤 문서를 선택할지 결정합니다.
{_id: -1}은 _id가 가장 큰, 즉 가장 최근에 삽입된 문서를 의미합니다. - update: 적용할 변경 내용입니다. 여기서는
$set연산자로 Score 필드만 수정했습니다. - new:
true로 설정하면 업데이트 후의 문서가 반환되고, 생략하거나false로 설정하면 업데이트 전의 문서가 반환됩니다.
4. 업데이트 결과 확인
다시 find() 메서드로 컬렉션 전체를 조회해 변경 사항을 확인합니다.
> db.demo516.find();
출력 결과를 보면 조건에 일치했던 세 개의 문서 중 마지막 문서의 Score만 98로 변경된 것을 알 수 있습니다.
{ "_id" : ObjectId("5e889fdb987b6e0e9d18f591"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ff1987b6e0e9d18f592"), "Name" : "John", "Age" : 23, "Score" : 67 }
{ "_id" : ObjectId("5e889ff3987b6e0e9d18f593"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ffa987b6e0e9d18f594"), "Name" : "John", "Age" : 22, "Score" : 98 }이처럼 findAndModify()와 sort 옵션을 조합하면 검색 조건에 맞는 여러 문서가 있더라도 원하는 하나의 문서(예: 마지막에 삽입된 문서)만 정확하게 업데이트할 수 있습니다.