MongoDB 쿼리 언어(MQL )와 함께 위치 연산자를 사용하여 배열 바꾸거나 추가하지 않고도 배열이 포함된 문서를 업데이트 수 있습니다.
이 튜토리얼에서는 MongoDB 내에서 위치 연산자에 대한 몇 가지 사용 사례를 제시합니다.
시작하기 전에
mongosh설치합니다.
배포에 연결합니다.
mongosh
를 사용하여 기본값test
데이터베이스의 새 컬렉션에 문서를 삽입합니다.db.employees.insertMany( [ { _id: 'SF', engineering: [ { name: 'Alice', email: 'missingEmail', salary: 100000 }, { name: 'Bob', email: 'missingEmail', salary: 75000 } ], sales: [ { name: 'Charlie', email: 'charlie@mail.com', salary: 90000, bonus: 1000 } ] }, { _id: 'NYC', engineering: [ { name: 'Dave', email: 'dave@mail.com', salary: 55000 }, ], sales: [ { name: 'Ed', email: 'ed@mail.com', salary: 99000, bonus: 2000 }, { name: 'Fran', email: 'fran@mail.com', salary: 50000, bonus: 10000 } ] } ] );
단계
다음 예시는 그 방법을 보여줍니다.
$ 연산자를 사용하여 배열의 첫 번째 일치 항목 업데이트하기
배열 내에서 첫 번째 일치 항목만 업데이트 하려면 $
연산자 사용합니다. $
연산자 일치하는 첫 번째 요소를 업데이트 자리 표시자 역할을 합니다.
다음 예시 및 연산자와 함께 updateOne()
$
메서드를 $set
사용하여 missingEmail
engineering
배열 에서 값을 가진 첫 번째 이메일 로 alice@mail.com
업데이트 .
1 db.employees.updateOne( 2 { "engineering.email": "missingEmail" }, 3 { "$set": { "engineering.$.email": "alice@mail.com" } } 4 );
find()
메서드를 사용하여 Alice의 이메일 에 대한 업데이트 확인합니다.
db.employees.find()
[ { _id: 'SF', engineering: [ { name: 'Alice', email: 'alice@mail.com', salary: 100000 }, { name: 'Bob', email: 'missingEmail', salary: 75000 } ], sales: [ { name: 'Charlie', email: 'charlie@mail.com', salary: 90000, bonus: 1000 } ] }, { _id: 'NYC', engineering: [ { name: 'Dave', email: 'dave@mail.com', salary: 55000 } ], sales: [ { name: 'Ed', email: 'ed@mail.com', salary: 99000, bonus: 2000 }, { name: 'Fran', email: 'fran@mail.com', salary: 50000, bonus: 10000 } ] } ]
위의 예시 와 같이 필드 로 설정하다 배열 요소가 있는 문서를 필터하다 engineering.email
missingEmail
$
후 연산자 필터하다 와 일치하는 첫 번째 항목만 업데이트합니다.
$ 연산자를 $elemMatch와 함께 사용하여 특정 요소 업데이트하기
특정 요소를 업데이트 하려면 $elemMatch
연산자 사용할 수 있습니다.
다음 예시 $elemMatch
연산자와 $
연산자를 사용하여 밥의 email
를 "bob@mail.com"
로 업데이트.
1 db.employees.updateOne( 2 { engineering: { $elemMatch: { name: "Bob", email: "missingEmail" } } }, 3 { $set: { "engineering.$.email": "bob@mail.com" } } 4 );
find()
메서드를 사용하여 밥의 이메일 에 대한 업데이트 확인합니다.
db.employees.find( { "engineering": { $elemMatch: { name: "Bob" } } }, { "engineering.$": 1, _id: 0 } );
[ { engineering: [ { name: 'Bob', email: 'bob@mail.com', salary: 75000 } ] } ]
$[] 연산자를 사용하여 문서 내의 모든 배열 요소 업데이트하기
단일 연산으로 배열 의 모든 요소를 업데이트 하려면 $[]
연산자 사용합니다.
NYC의 영업 사원에게000 의 추가 보너스 $2를 지급하려는 경우를 가정해 보겠습니다. 메서드를 연산자 및 $[]
$inc
연산자 updateMany()
와 함께 사용하여 bonus
sales
NYC
문서 의 배열 에 있는 모든 필드를 만큼 늘릴 수 2000
있습니다.
1 db.employees.updateMany( 2 { "_id": "NYC" }, 3 { "$inc": { "sales.$[].bonus": 2000 } } 4 );
find()
메서드를 사용하여 NYC 팀 직원의 bonus
필드에 대한 업데이트 확인합니다.
db.employees.find( { _id: "NYC" }, { sales: 1, _id: 0 } );
[ { sales: [ { name: 'Ed', email: 'ed@mail.com', salary: 99000, bonus: 4000 }, { name: 'Fran', email: 'fran@mail.com', salary: 50000, bonus: 12000 } ] } ]
$[<identifier>] 연산자를 사용하여 필터 조건과 일치하는 요소 업데이트하기
바꾸기 작업과 쌍을 이루는 과도한 클라이언트 사이드 코드 없이 단일 작업으로 여러 배열 요소를 업데이트 하려면 $[<identifier>]
연산자 사용합니다. $[<identifier>]
연산자는 arrayFilters 조건과 일치하는 모든 요소를 업데이트 자리 표시자 역할을 합니다.
특정 직원이 여러 조건을 충족하는 경우 해당 직원의 급여를 업데이트 하려는 경우를 생각해 보세요. updateMany()
메서드를 $[<identifier>]
연산자와 함께 사용하여 이 작업 수행할 수 있습니다.
1 db.employees.updateMany( 2 {}, 3 { 4 "$set": { 5 "engineering.$[elemX].salary": 95000, 6 "sales.$[elemY].salary": 75000 7 } 8 }, 9 { 10 "arrayFilters": [ 11 { "elemX.name": "Bob", "elemX.salary": 75000 }, 12 { "elemY.name": "Ed", "elemY.salary": 50000, } 13 ] 14 } 15 );
위의 예시 에서 첫 번째 매개변수는 컬렉션 의 모든 문서를 평가하기 위한 빈 일치 항목입니다.
elemX
및 elemY
은(는) 두 개의 서로 다른 arrayFilters:를 나타냅니다.
elemX
과 일치하려면 배열 객체name
필드Bob
이고salary
이75000
이어야 합니다.elemY
과 일치하려면 배열 객체name
필드Ed
이고salary
이50000
이어야 합니다.
문서 의 배열 항목이 elemX
필터하다 와 일치하면 updateMany()
는 객체 의 salary
필드 95000
로 설정합니다. 배열 항목이 elemY
필터하다 와 일치하면 updateMany()
는 객체 의 salary
필드 75000
로 설정합니다. 필터하다 일치하지 않으면 해당 $set
작업이 트리거하다 되지 않습니다.
find()
메서드를 사용하여 밥이 elemX
의 두 조건을 모두 충족하므로 급여 업데이트 확인합니다.
db.employees.find( { "engineering.name": "Bob" }, { engineering: { $elemMatch: { name: "Bob" } }, _id: 0 } );
[ { engineering: [ { name: "Bob", email: "bob@mail.com", salary: 95000 } ] } ]
find()
메서드를 사용하여 에드가 elemX
또는 elemY
의 조건을 충족하지 않아 급여 업데이트에 실패했는지 확인합니다.
db.employees.find( { "sales.name": "Ed" }, { sales: { $elemMatch: { name: "Ed" } }, _id: 0 } );
[ { sales: [ { name: "Ed", email: "ed@mail.com", salary: 99000, bonus: 4000 } ] } ]
결론
이 튜토리얼에서는 MongoDB 쿼리 언어(MQL) 내의 몇 가지 위치 연산자에 대해 설명합니다. 이러한 연산자는 배열 에서 전체 바꾸기나 확장된 클라이언트 사이드 조작을 수행할 필요가 없기 때문에 배열로 작업할 때 유용합니다. MQL 에 대해 자세히 학습하려면 Atlas 시작하기를 참조하세요.
MongoDB 의 업데이트 연산자에 대해 자세히 학습하려면 업데이트 연산자를 참조하세요.