이 findAndModify 명령은 단일 문서를 원자성으로 수정하고 반환하는 데 사용됩니다. 이 명령은 단일 단계에서 문서를 읽고 업데이트하여 데이터 일관성을 보장해야 하는 작업에 유용합니다. 일반적인 사용 사례에는 카운터, 큐 및 기타 원자성 작업 구현이 포함됩니다.
문법
명령에 대한 findAndModify 구문은 다음과 같습니다.
db.collection.findAndModify({
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
})
매개 변수
- query: 수정할 문서의 선택 조건입니다.
- sort: 쿼리에서 여러 문서를 선택하는지 여부를 수정할 문서를 결정합니다.
-
remove: 이면
true선택한 문서를 제거합니다. - update: 적용할 수정 사항입니다.
-
new: If이면
true원본이 아닌 수정된 문서를 반환합니다. - fields: 일치하는 문서에 대해 반환할 필드를 제한합니다.
-
upsert: 쿼리와 일치하는 문서가 없으면
true새 문서를 만듭니다.
예시
예제 1: 총 판매액 업데이트
업데이트 _id 된 문서를 "e5767a9f-cd95-439c-9ec4-7ddc13d22926"으로 업데이트하고 반환하려고 합니다 550000.00 .
db.stores.findAndModify({
query: { "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926" },
update: { $set: { "sales.totalSales": 550000.00 } },
new: true
})
샘플 출력
{
"_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926",
"name": "Marina's Eyewear Bargains",
"location": { "lat": -87.4376, "lon": 42.2928 },
"staff": { "totalStaff": { "fullTime": 20, "partTime": 6 } },
"sales": {
"totalSales": 550000,
"salesByCategory": [
{ "categoryName": "Round Sunglasses", "totalSales": 39621 },
{ "categoryName": "Reading Glasses", "totalSales": 1146 },
{ "categoryName": "Aviators", "totalSales": 9385 }
]
},
"promotionEvents": [
{
"eventName": "Incredible Discount Days",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 2, "Day": 11 },
"endDate": { "Year": 2024, "Month": 2, "Day": 18 }
},
"discounts": [
{ "categoryName": "Square Sunglasses", "discountPercentage": 16 },
{ "categoryName": "Safety Glasses", "discountPercentage": 17 },
{ "categoryName": "Wayfarers", "discountPercentage": 7 },
{ "categoryName": "Eyewear Accessories", "discountPercentage": 12 }
]
}
],
"tag": [
"#ShopLocal",
"#FashionStore",
"#SeasonalSale",
"#FreeShipping",
"#MembershipDeals"
]
}
예제 2: 새 프로모션 이벤트 추가
"e5767a9f-cd95-439c-9ec4-7ddc13d22926"을 사용하여 "Electronics Super Saver"라는 새로운 프로모션 이벤트를 스토어 _id_ 에 추가하고 업데이트된 문서를 반환해 보겠습니다.
db.stores.findAndModify({
query: { "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926" },
update: { $push: { "promotionEvents": {
"eventName": "Electronics Super Saver",
"promotionalDates": {
"startDate": "2025-09-31",
"endDate": "2025-09-31"
},
"discounts": [
{
"categoryName": "Laptops",
"discountPercentage": 45
},
{
"categoryName": "Smartphones",
"discountPercentage": 25
}
]
}}},
new: true
})
샘플 출력
{
"_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926",
"name": "Marina's Eyewear Bargains",
"location": { "lat": -87.4376, "lon": 42.2928 },
"staff": { "totalStaff": { "fullTime": 20, "partTime": 6 } },
"sales": {
"totalSales": 550000,
"salesByCategory": [
{ "categoryName": "Round Sunglasses", "totalSales": 39621 },
{ "categoryName": "Reading Glasses", "totalSales": 1146 },
{ "categoryName": "Aviators", "totalSales": 9385 }
]
},
"promotionEvents": [
{
"eventName": "Electronics Super Saver",
"promotionalDates": { "startDate": "2025-09-31", "endDate": "2025-09-31" },
"discounts": [
{ "categoryName": "Laptops", "discountPercentage": 45 },
{ "categoryName": "Smartphones", "discountPercentage": 25 }
]
}
],
"tag": [
"#ShopLocal",
"#FashionStore",
"#SeasonalSale",
"#FreeShipping",
"#MembershipDeals"
]
}
예제 3: 프로모션 이벤트 제거
"e5767a9f-cd95-439c-9ec4-7ddc13d22926"을 사용하여 스토어 _id 에서 "Electronics Super Saver" 프로모션 이벤트를 제거하고 원래 문서를 반환하려고 합니다.
db.stores.findAndModify({
query: { "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926" },
update: { $pull: { "promotionEvents": { "eventName": "Electronics Super Saver" } } },
new: true
})
샘플 출력
{
"_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926",
"name": "Marina's Eyewear Bargains",
"location": { "lat": -87.4376, "lon": 42.2928 },
"staff": { "totalStaff": { "fullTime": 20, "partTime": 6 } },
"sales": {
"totalSales": 550000,
"salesByCategory": [
{ "categoryName": "Round Sunglasses", "totalSales": 39621 },
{ "categoryName": "Reading Glasses", "totalSales": 1146 },
{ "categoryName": "Aviators", "totalSales": 9385 }
]
},
"promotionEvents": [
{
"eventName": "Incredible Discount Days",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 2, "Day": 11 },
"endDate": { "Year": 2024, "Month": 2, "Day": 18 }
},
"discounts": [
{ "categoryName": "Square Sunglasses", "discountPercentage": 16 },
{ "categoryName": "Safety Glasses", "discountPercentage": 17 },
{ "categoryName": "Wayfarers", "discountPercentage": 7 },
{ "categoryName": "Eyewear Accessories", "discountPercentage": 12 }
]
}
],
"tag": [
"#ShopLocal",
"#FashionStore",
"#SeasonalSale",
"#FreeShipping",
"#MembershipDeals"
]
}