Database/NoSQL

[MongoDB] 몽고DB에서 document(문서) 관리

코딩for 2022. 10. 25. 10:16
반응형

 

MongoDB에서 문서를 관리하는 방법(번역)

 

 

MongoDB Documents - How to Delete, Update, Query, and More

Read on to learn how to create and manage documents within MongoDB, including how to delete, update, query, and more.

www.prisma.io

 

MongoDB 문서란 무엇입니까?

MongoDB에서 데이터베이스 및 컬렉션 내의 모든 데이터는 문서에 저장됩니다. 컬렉션은 기본적으로 필요한 스키마 를 지정하지 않기 때문에 컬렉션 내의 문서는 임의로 복잡한 구조를 포함할 수 있으며 형제 문서에서 사용하는 형식과 일치할 필요가 없습니다. 이는 놀라운 유연성을 제공하고 응용 프로그램 요구 사항이 변경됨에 따라 스키마를 유기적으로 개발할 수 있습니다.

MongoDB 문서 자체 는 JSON JavaScript Object Notation 의 이진 표현인 BSON 데이터 직렬화 형식 을 사용합니다 . 이것은 프로그래밍 방식으로 쿼리하고 조작할 수 있는 정의된 데이터 유형으로 구성된 구조를 제공합니다.

{}BSON 문서는 키-값 쌍을 포함 하는 한 쌍의 중괄호( )로 표시됩니다. BSON에서 이러한 데이터 쌍은 필드 및 해당  으로 알려져 있습니다. 필드가 먼저 오고 문자열로 표시됩니다. 값은 모든 유효한 BSON 데이터 유형일 수 있습니다 . 콜론( :)은 필드를 값과 구분합니다. 쉼표는 각 필드와 값 쌍을 서로 구분하는 데 사용됩니다.

예를 들어 다음은 MongoDB가 이해할 수 있는 유효한 BSON 문서입니다.

{
    _id: 80380,
    vehicle_type: "car",
    mileage: 7377.80,
    color: "blue",
    markets: [
        "US",
        "UK"
    ],
    options: {
        transmission: "automatic",
        num_doors: 4,
        power_windows: true
    }
}

여기에서 꽤 많은 유형을 볼 수 있습니다.

  • _id정수
  • vehicle_type그리고 color문자열이다
  • mileage부유물이다
  • markets문자열의 배열입니다
  • options문자열, 정수 및 부울로 구성된 값이 있는 중첩 문서를 포함합니다.

이러한 유연성으로 인해 문서는 데이터를 저장하기 위한 상당히 유연한 매체입니다. 새 필드를 쉽게 추가할 수 있고 문서를 서로 삽입할 수 있으며 구조적 복잡성이 저장되는 데이터와 정확히 일치합니다.

새 문서를 만드는 방법

새 문서를 생성하려면 생성된 문서를 저장할 데이터베이스로 변경합니다. school이 문서에서는 데모 목적으로 데이터베이스를 사용합니다 .

use school

문서를 삽입할 컬렉션도 선택해야 합니다. 데이터베이스와 마찬가지로 문서를 삽입할 컬렉션을 명시적으로 만들 필요가 없습니다. MongoDB는 첫 번째 데이터가 작성될 때 자동으로 생성합니다. 이 예에서는 이라는 컬렉션을 사용합니다 students.

문서가 저장될 위치를 알았으므로 다음 방법 중 하나를 사용하여 새 문서를 삽입할 수 있습니다.

insert()방법 사용

 insert()메서드를 사용하면 호출된 컬렉션에 하나 이상의 문서를 삽입할 수 있습니다.

단일 문서를 삽입하려면 컬렉션에서 문서를 호출하여 메서드에 문서를 전달합니다. 여기에 Ashley라는 학생의 새 문서를 삽입합니다.

db.students.insert(
{
first_name: "Ashley",
last_name: "Jenkins",
dob: new Date("January 08, 2003"),
grade_level: 8
}
)
 

동시에 둘 이상의 문서를 삽입하려면 문서를 에 전달하는 대신 문서 insert()배열을 전달하십시오. Brian과 Leah라는 학생을 위해 두 개의 새 문서를 추가할 수 있습니다.

db.students.insert(
    [
        {
            first_name: "Brian",
            last_name: "McMantis",
            dob: new Date("September 18, 2010"),
            grade_level: 2
        },
        {
            first_name: "Leah",
            last_name: "Drake",
            dob: new Date("October 03, 2009")
        }
    ]
)
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

대량 쓰기 작업 을 수행했기 때문에 반환 값은 이전 BulkWriteResult에 본 WriteResult개체가 아닙니다.

 insert()방법은 유연하지만 다음 두 가지 방법을 위해 많은 MongoDB 드라이버에서 더 이상 사용되지 않습니다.

insertOne()방법 사용

 insertOne()방법을 사용하여 단일 문서를 삽입할 수 있습니다. 방법 과 달리 insert()한 번에 하나의 문서만 삽입할 수 있으므로 동작을 좀 더 예측 가능하게 만듭니다.

insert()구문은 단일 문서를 추가 할 때와 동일합니다 . Naomi라는 다른 학생을 추가할 수 있습니다.

db.students.insertOne(
    {
        first_name: "Naomi",
        last_name: "Pyani"
    }
)
{
        "acknowledged" : true,
        "insertedId" : ObjectId("60e877914655cbf49ff7cb86")
}

와 달리 insert()이 insertOne()메서드는 유용한 추가 정보가 포함된 문서를 반환합니다. 쓰기가 클러스터에서 승인되었음을 확인하고 문서에 할당된 개체 ID를 제공하지 않았기 때문에 포함합니다.

insertMany()방법 사용

한 번에 여러 문서를 삽입하려는 시나리오를 다루기 위해 insertMany()이제 이 방법을 권장합니다. insert()로 여러 문서 를 삽입할 때와 마찬가지로 문서 insertMany()배열을 사용합니다.

Jasmine, Michael 및 Toni라는 세 명의 새 학생을 추가할 수 있습니다.

 
db.students.insertMany(
    [
        {
            first_name: "Jasmine",
            last_name: "Took",
            dob: new Date("April 11, 2011")
        },
        {
            first_name: "Michael",
            last_name: "Rodgers",
            dob: new Date("February 25, 2008"),
            grade_level: 6
        },
        {
            first_name: "Toni",
            last_name: "Fowler"
        }
    ]
)
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("60e8792d4655cbf49ff7cb87"),
                ObjectId("60e8792d4655cbf49ff7cb88"),
                ObjectId("60e8792d4655cbf49ff7cb89")
        ]
}

와 마찬가지로 쓰기를 확인하고 삽입된 문서에 할당된 ID를 포함하는 배열을 제공하는 문서를 반환합니다 insertOne().insertMany()

기존 문서를 쿼리하는 방법

문서 쿼리는 자체 기사를 보증하는 상당히 광범위한 주제입니다. 다양한 유형의 문서를 검색하기 위해 쿼리를 공식화하는 방법에 대한 자세한 내용은 MongoDB 내 데이터 쿼리 가이드에서 찾을 수 있습니다 .

세부 사항은 위에 링크된 기사에 가장 잘 남아 있지만 최소한 MongoDB가 문서를 쿼리하기 위해 제공하는 방법을 다룰 수 있습니다. MongoDB에서 문서를 가져오는 주요 방법은 find()해당 컬렉션의 메서드를 호출하는 것입니다.

예를 들어, 에서 모든 문서를 수집하려면 인수 없이 students호출할 수 있습니다 .find()

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }
{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

출력을 더 읽기 쉽게 만들기 위해 다음과 같이 pretty()메서드 를 연결할 수도 있습니다 find().

db.<collection>.find().pretty()
{
        "_id" : ObjectId("60e8743b4655cbf49ff7cb83"),
        "first_name" : "Ashley",
        "last_name" : "Jenkins",
        "dob" : ISODate("2003-01-08T00:00:00Z"),
        "grade_level" : 8
}
{
        "_id" : ObjectId("60e875d54655cbf49ff7cb84"),
        "first_name" : "Brian",
        "last_name" : "McMantis",
        "dob" : ISODate("2010-09-18T00:00:00Z"),
        "grade_level" : 2
}
{
        "_id" : ObjectId("60e875d54655cbf49ff7cb85"),
        "first_name" : "Leah",
        "last_name" : "Drake",
        "dob" : ISODate("2009-10-03T00:00:00Z")
}
{
        "_id" : ObjectId("60e877914655cbf49ff7cb86"),
        "first_name" : "Naomi",
        "last_name" : "Pyani"
}
{
        "_id" : ObjectId("60e8792d4655cbf49ff7cb87"),
        "first_name" : "Jasmine",
        "last_name" : "Took",
        "dob" : ISODate("2011-04-11T00:00:00Z")
}
{
        "_id" : ObjectId("60e8792d4655cbf49ff7cb88"),
        "first_name" : "Michael",
        "last_name" : "Rodgers",
        "dob" : ISODate("2008-02-25T00:00:00Z"),
       "grade_level" : 6
}
{
        "_id" : ObjectId("60e8792d4655cbf49ff7cb89"),
        "first_name" : "Toni",
        "last_name" : "Fowler"
}

 

_id각 문서에 필드가 추가된 것을 확인할 수 있습니다 . MongoDB는 _id컬렉션의 각 문서에 대해 고유해야 합니다. 객체 생성 시 제공하지 않으면 자동으로 추가됩니다. 이 ID를 사용하여 단일 개체를 안정적으로 검색할 수 있습니다.

db.students.find(
    {
        _id : ObjectId("60e8792d4655cbf49ff7cb89")
    }
)
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

위에 링크된 기사에서 데이터를 쿼리하는 다양한 방법에 대해 자세히 알아볼 수 있습니다.

기존 문서를 업데이트하는 방법

데이터베이스의 대부분 또는 대부분의 사용 사례에서는 데이터베이스 내의 기존 데이터를 수정할 수 있어야 합니다. 새 값을 반영하기 위해 필드를 업데이트해야 할 수도 있고 사용 가능한 기존 문서에 추가 정보를 추가해야 할 수도 있습니다.

MongoDB는 몇 가지 관련 방법을 사용하여 기존 문서를 업데이트합니다.

  • updateOne(): 제공된 필터를 기반으로 컬렉션 내의 단일 문서를 업데이트합니다.
  • updateMany(): 제공된 필터와 일치하는 컬렉션 내의 여러 문서를 업데이트합니다.
  • replaceOne(): 제공된 필터를 기반으로 컬렉션의 전체 문서를 바꿉니다.

이러한 각 유형을 사용하여 다양한 유형의 업데이트를 수행하는 방법을 다룰 것입니다.

업데이트 연산자

문서를 업데이트하는 각 방법을 살펴보기 전에 사용 가능한 업데이트 연산자를 살펴보겠습니다.

  • $currentDate: 필드 값을 날짜 또는 타임스탬프 유형으로 현재 날짜로 설정합니다.
    • 통사론:{ $currentDate: { <field>: <type>, ... } }
  • $inc: 필드 값을 설정된 양만큼 증가시킵니다.
    • 통사론:{ $inc: { <field>: <amount>, ... } }
  • $min: 지정된 값이 현재 값보다 작으면 필드 값을 업데이트합니다.
    • 통사론:{ $min: { <field>: <value>, ... } }
  • $max: 지정된 값이 현재 값보다 크면 필드 값을 업데이트합니다.
    • 통사론:{ $max: { <field>: <value>, ... } }
  • $mul: 주어진 숫자를 곱하여 필드 값을 업데이트합니다.
    • 통사론:{ $mul: { <field>: <value>, ... } }
  • $rename: 필드 이름을 새 식별자로 바꿉니다.
    • 통사론:{ $rename: { <field>: <new_name>, ... } }
  • $set: 필드의 값을 주어진 값으로 바꿉니다.
    • 통사론:{ $set: { <field>: value, ... } }
  • $setOnInsert: upsert 작업 중에 새 문서가 생성되는 경우 필드 값을 설정하고 다른 작업은 수행하지 않습니다.
    • 통사론:{ $setOnInsert: { <field>: <value>, ... } }
  • $unset: 문서에서 필드를 제거합니다.
    • 통사론:{ $unset: { <field>: "", ... } }
  • $: 쿼리를 만족하는 첫 번째 배열 요소에 대한 자리 표시자입니다.
    • 통사론:{ <update_operator>: {<array>.$: <value> } }
  • $[]: 쿼리를 충족하는 모든 배열 요소에 대한 자리 표시자입니다.
    • 통사론:{ <update_operator>: { <array>.$[]: <value> } }
  • $addToSet: 이미 존재하지 않는 한 배열에 값을 추가합니다.
    • 통사론:{ $addToSet: { <field>: <value>, ... } }
  • $pop: 배열의 첫 번째 또는 마지막 요소를 제거합니다.
    • 통사론:{ $pop: { <field>: (-1 or 1), ... } }
  • $pull: 조건과 일치하는 배열의 모든 요소를 ​​제거합니다.
    • 통사론:{ $pull: { <field>: <condition>, ... } }
  • $push: 배열에 값을 추가합니다.
    • 통사론:{ $push: { <field>: <value>, ... } }
  • $pullAll: 배열에서 지정된 모든 요소를 ​​제거합니다.
    • 통사론:{ $pullAll: { <field>: [ <value>, ... ], ...} }
  • $each: 배열 대신 배열의 각 요소를 단일 요소로 추가하도록 $addToSet및 연산자를 수정 합니다.$push
    • 통사론:{ <update_operator>: { <field>: { $each: [ <value>, ... ] }, ... } }
  • $position: 연산자와 함께 사용되며 연산자가 삽입해야 $each하는 위치를 지정합니다 .$push
    • 통사론:{ $push: { <field>: { $each: [ <value>, ... ], $position: <num> } } }
  • $slice: $each및 와 함께 사용 $push하여 배열의 총 요소 수를 제한합니다.
    • 통사론:{ $push: { <field>: { $each: [ <value>, ... ], $slice: <num> } } }
  • $sort: $each및 와 함께 사용하여 $push배열 요소를 정렬합니다.
    • 통사론:{ $push: { <field>: { $each: [ <value>, ... ], $sort: <sort_order> } } }

이러한 다양한 업데이트 연산자를 사용하면 문서의 다양한 필드를 다양한 방식으로 업데이트할 수 있습니다.

컬렉션의 단일 문서 업데이트

MongoDB의 updateOne()방법은 컬렉션 내의 단일 문서를 업데이트하는 데 사용됩니다. 이 메서드는 두 개의 필수 인수와 선택적 인수를 지정하는 문서를 사용합니다.

첫 번째 인수는 문서를 선택하는 데 사용할 필터 조건을 지정하는 문서입니다. updateOne()메서드는 컬렉션에서 최대 하나의 문서를 수정하므로 필터 조건을 충족하는 첫 번째 문서가 사용됩니다 .

두 번째 인수는 실행해야 하는 업데이트 작업을 지정합니다. 위에 제공된 업데이트 작업을 여기에서 지정하여 일치하는 문서의 내용을 변경할 수 있습니다.

세 번째 인수는 메서드의 동작을 수정하기 위한 다양한 옵션의 문서입니다. 가장 중요한 잠재적 가치는 다음과 같습니다.

  • upsert: 필터가 기존 문서와 일치하지 않는 경우 새 문서를 삽입하여 작업을 upsert 프로시저로 전환합니다.
  • collation: 작업에 적용해야 하는 언어별 규칙을 정의하는 문서입니다.

_id예를 들어 올바른 문서를 대상으로 하도록 필드 별로 필터링하는 단일 학생 레코드를 업데이트할 수 있습니다 . grade_level새 값으로 설정할 수 있습니다 .

db.students.updateOne(
    { _id: ObjectId("60e8792d4655cbf49ff7cb89") },
    { $set: { grade_level: 3 } }
)
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

컬렉션의 여러 문서 업데이트

MongoDB의 updateMany()방법은 방법과 유사하게 작동 updateOne()하지만 대신 첫 번째 일치 후에 중지하는 대신 지정된 필터와 일치하는 문서를 업데이트합니다.

구문 은 구문을 updateMany()정확히 따르 updateOne()므로 유일한 차이점은 작업 범위입니다.

subjects예를 들어, 컬렉션 문서의 배열에서 "composition"의 모든 인스턴스를 "writing"으로 변경하려는 경우 teachers다음과 같이 사용할 수 있습니다.

db.teachers.updateMany(
    { subject: "composition" },
    { $set: { "subjects.$": "writing" } }
)
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

문서를 확인하면 "composition"의 각 인스턴스가 "writing"으로 대체되어야 합니다.

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Nancy", "last_name" : "Smith", "subjects" : [ "vocabulary", "pronunciation" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }

문서 교체

 replaceOne()방법은 방법과 유사하게 작동 updateOne()하지만 개별 필드를 업데이트하는 대신 전체 문서를 대체합니다. 구문은 이전 두 명령과 동일합니다.

예를 들어 Nancy Smith가 학교를 그만두고 그녀를 문학을 가르치는 Clara Newman이라는 교사로 교체하는 경우 다음을 입력할 수 있습니다.

db.teachers.replaceOne(
    {
        $and: [ 
            { first_name: "Nancy" },
            { last_name: "Smith" }
        ]
    },
    {
        first_name: "Clara",
        last_name: "Newman",
        subjects: [ "literature" ]
    }
)
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

일치하는 문서가 제거되었고 지정된 문서로 대체되었음을 확인할 수 있습니다.

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Clara", "last_name" : "Newman", "subjects" : [ "literature" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }

문서를 삭제하는 방법

컬렉션에서 문서를 제거하는 것도 문서 수명 주기의 일부입니다. deleteOne()문서를 제거하려면 또는 deleteMany()메서드 를 사용할 수 있습니다 . 구문은 동일하며 작동하는 문서의 수만 다릅니다.

대부분의 경우 이러한 방법 중 하나로 문서를 삭제하려면 삭제할 문서를 선택하는 방법을 지정하는 필터 문서를 문서에 제공하기만 하면 됩니다.  deleteOne()메서드는 필터가 생성하는 일치 항목의 수에 관계없이 최대 하나의 문서를 삭제하는 반면 deleteMany()메서드는 필터 조건과 일치하는 모든 문서를 삭제합니다.

예를 들어, 단일 학생을 삭제하려면 _id명시적으로 일치하도록 제공할 수 있습니다.

db.students.deleteOne({
    _id: ObjectId("60e8792d4655cbf49ff7cb87")
})
{ "acknowledged" : true, "deletedCount" : 1 }

학년 수준이 할당되지 않은 학생을 삭제하려면 다음 deleteMany()방법을 대신 사용할 수 있습니다.

db.students.deleteMany({
    grade_level: { $eq: null }
})
{ "acknowledged" : true, "deletedCount" : 2 }

확인하면 나머지 모든 학생에게 학년 수준이 할당되어 있음을 알 수 있습니다.

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler", "grade_level" : 3 }
반응형