Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/
데이터베이스 매뉴얼
/ /

MQL 위치 연산자를 사용하여 문서에서 배열 요소 업데이트하기

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 업데이트 .

1db.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 연산자와 $ 연산자를 사용하여 밥의 email"bob@mail.com"로 업데이트.

1db.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 있습니다.

1db.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>] 연산자는 arrayFilters 조건과 일치하는 모든 요소를 업데이트 자리 표시자 역할을 합니다.

특정 직원이 여러 조건을 충족하는 경우 해당 직원의 급여를 업데이트 하려는 경우를 생각해 보세요. updateMany() 메서드를 $[<identifier>] 연산자와 함께 사용하여 이 작업 수행할 수 있습니다.

1db.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);

위의 예시 에서 첫 번째 매개변수는 컬렉션 의 모든 문서를 평가하기 위한 빈 일치 항목입니다.

elemXelemY 은(는) 두 개의 서로 다른 arrayFilters:를 나타냅니다.

  • elemX과 일치하려면 배열 객체 name 필드 Bob 이고 salary75000이어야 합니다.

  • elemY과 일치하려면 배열 객체 name 필드 Ed 이고 salary50000이어야 합니다.

문서 의 배열 항목이 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 의 업데이트 연산자에 대해 자세히 학습하려면 업데이트 연산자를 참조하세요.

돌아가기

방법

이 페이지의 내용