Docs Menu
Docs Home
/ / /
Scala
/

쓰기 작업

이 페이지의 내용

  • 전제 조건
  • MongoDB 배포에 연결하기
  • 문서 삽입
  • 여러 문서를 삽입합니다.
  • 기존 문서 업데이트
  • 필터
  • 연산자 업데이트
  • 단일 문서 업데이트
  • 여러 문서 업데이트하기
  • 업데이트 옵션
  • 기존 문서 교체
  • 필터
  • 문서 교체하기
  • 업데이트 옵션
  • 문서 삭제
  • 필터
  • 단일 문서 삭제
  • 여러 문서 삭제
  • 쓰기 고려

쓰기 작업을 수행하여 새 문서를 삽입하거나, 기존 문서를 업데이트하거나, 기존 문서를 바꾸거나, 컬렉션에서 기존 문서를 삭제할 수 있습니다.

이 가이드의 코드 예제를 실행하려면 다음 구성 요소를 설정해야 합니다.

  • test.restaurants restaurants.json 문서 자산 에 있는 파일의 문서로 채워진 컬렉션입니다.Github

  • 다음 가져오기 문:

import org.mongodb.scala._
import org.mongodb.scala.model._
import org.mongodb.scala.model.Filters._
import org.mongodb.scala.model.Updates._
import org.mongodb.scala.model.UpdateOptions
import org.mongodb.scala.bson.BsonObjectId

참고

이 가이드 에서는 퀵 스타트 프라이머에 설명된 대로 Observable 암시를 사용합니다.

먼저 MongoDB deployment에 연결한 다음 MongoDatabaseMongoCollection 인스턴스를 선언하고 정의합니다.

다음 코드는 포트 27017localhost 에서 실행되는 독립형 MongoDB 배포서버에 연결합니다. 그런 다음 test 데이터베이스를 참조하는 database 변수와 restaurants 컬렉션을 참조하는 collection 변수를 정의합니다.

val mongoClient: MongoClient = MongoClient()
val database: MongoDatabase = mongoClient.getDatabase("test")
val collection: MongoCollection[Document] = database.getCollection("restaurants")

MongoDB deployment에 연결하는 방법에 대해 자세히 알아보려면 MongoDB에 연결 튜토리얼을 참조하세요.

컬렉션에 단일 문서를 삽입하려면 컬렉션의 insertOne() 메서드를 사용할 수 있습니다.

val document = Document("name" -> "Café Con Leche" ,
"contact" -> Document("phone" -> "228-555-0149",
"email" -> "cafeconleche@example.com",
"location" -> Seq(-73.92502, 40.8279556)),
"stars" -> 3, "categories" -> Seq("Bakery", "Coffee", "Pastries"))
collection.insertOne(document).printResults()

참고

문서에 최상위 _id 필드가 지정되지 않은 경우 MongoDB는 자동으로 값을 생성하고 이 필드를 삽입된 문서에 추가합니다.

여러 문서를 삽입하려면 삽입할 문서 목록을 매개 변수로 사용하는 collection의 insertMany() 메서드를 사용할 수 있습니다.

다음 예제에서는 컬렉션에 두 개의 문서를 삽입합니다.

val doc1 = Document("name" -> "Amarcord Pizzeria" ,
"contact" -> Document("phone" -> "264-555-0193",
"email" -> "amarcord.pizzeria@example.net",
"location" -> Seq(-73.88502, 40.749556)),
"stars" -> 2, "categories" -> Seq("Pizzeria", "Italian", "Pasta"))
val doc2 = Document("name" -> "Blue Coffee Bar" ,
"contact" -> Document("phone" -> "604-555-0102",
"email" -> "bluecoffeebar@example.com",
"location" -> Seq(-73.97902, 40.8479556)),
"stars" -> 5, "categories" -> Seq("Coffee", "Pastries"))
collection.insertMany(Seq(doc1, doc2)).printResults()

참고

문서에 최상위 _id 필드가 지정되지 않은 경우 MongoDB는 자동으로 값을 생성하고 이 필드를 삽입된 문서에 추가합니다.

컬렉션의 기존 문서를 업데이트하려면 컬렉션의 updateOne() 또는 updateMany() 메서드를 사용할 수 있습니다.

필터 문서를 메서드에 전달하여 업데이트할 문서를 지정할 수 있습니다. 필터 문서 사양은 읽기 작업과 동일합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters 헬퍼 클래스를 제공합니다.

빈 필터를 지정하고 컬렉션의 모든 문서를 일치시키려면 빈 Document 객체를 필터로 사용합니다.

문서의 필드를 변경하기 위해 MongoDB는 업데이트 연산자를 제공합니다. 업데이트 연산자를 사용하여 수행할 수정을 지정하려면 업데이트 문서를 만듭니다. 업데이트 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 업데이트 연산자를 참조하세요.

업데이트 문서를 쉽게 만들 수 있도록 드라이버는 Updates 도우미 클래스를 제공합니다. 빌더를 사용하여 업데이트를 지정하는 방법에 대해 자세히 알아보려면 업데이트 가이드를 참조하세요.

중요

_id 필드는 변경할 수 없으므로 문서에서 _id 필드의 값을 변경할 수 없습니다.

updateOne() 메서드는 필터 조건이 컬렉션의 여러 문서와 일치하더라도 단일 문서를 업데이트합니다.

restaurants 컬렉션에 대한 다음 작업은 _id 필드 값이 BsonObjectId("57506d62f57802807471dd41") 인 문서를 업데이트합니다.

collection.updateOne(
equal("_id", BsonObjectId("57506d62f57802807471dd41")),
combine(set("stars", 1), set("contact.phone", "228-555-9999"), currentDate("lastModified")))
.printResults()

구체적으로 이 작업에서는 다음 메서드를 사용합니다.

  • Updates.set() stars 필드의 값을 1 (으)로 설정하고 contact.phone 필드의 값을 "228-555-9999"으)로 설정합니다.

  • Updates.currentDate() lastModified 필드를 현재 날짜로 수정합니다. lastModified 필드가 존재하지 않으면 연산자는 해당 필드를 문서에 추가합니다.

updateMany() 메서드는 필터 조건과 일치하는 모든 문서를 업데이트합니다.

restaurants 컬렉션에 대한 다음 작업은 stars 필드의 값이 2 인 모든 문서를 업데이트합니다.

collection.updateMany(
equal("stars", 2),
combine(set("stars", 0), currentDate("lastModified")))
.println()

구체적으로 이 작업에서는 다음 메서드를 사용합니다.

  • Updates.set() stars 필드의 값을 0 (으)로 설정합니다.

  • Updates.currentDate() lastModified 필드를 현재 날짜로 설정합니다. lastModified 필드가 존재하지 않으면 연산자는 해당 필드를 문서에 추가합니다.

updateOne()updateMany() 메서드를 사용할 때 UpdateOptions 문서를 포함하여 upsert 옵션 또는 bypassDocumentationValidation 옵션을 지정할 수 있습니다.

collection.updateOne(
equal("_id", 1),
combine(set("name", "Fresh Breads and Tulips"), currentDate("lastModified")),
UpdateOptions().upsert(true).bypassDocumentValidation(true))
.printResults()

컬렉션의 기존 문서를 바꾸려면 컬렉션의 replaceOne() 메서드를 사용할 수 있습니다.

중요

_id 필드는 변경할 수 없으므로 문서에서 _id 필드를 바꿀 수 없습니다.

필터 문서를 replaceOne() 메서드에 전달하여 교체할 문서를 지정할 수 있습니다. 필터 문서 사양은 읽기 작업과 동일합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters 헬퍼 클래스를 제공합니다.

빈 필터를 지정하고 컬렉션의 모든 문서를 일치시키려면 빈 Document 객체를 필터로 사용합니다.

replaceOne() 메서드는 필터 조건이 컬렉션의 여러 문서와 일치하더라도 최대 단일 문서를 대체합니다.

문서를 교체하려면 새 문서를 replaceOne() 메서드에 전달합니다.

중요

대체 문서에는 원본 문서와 다른 필드가 있을 수 있습니다. 대체 문서에서 _id 필드는 변경되지 않으므로 _id 필드를 생략할 수 있습니다. 그러나 _id 필드를 포함하는 경우 _id 필드에 다른 값을 지정할 수 없습니다.

restaurants 컬렉션에 대한 다음 작업은 _id 필드의 값이 BsonObjectId("57506d62f57802807471dd41") 인 문서를 대체합니다.

collection.replaceOne(
equal("_id", BsonObjectId("57506d62f57802807471dd41")),
Document("name" -> "Green Salads Buffet", "contact" -> "TBD",
"categories" -> Seq("Salads", "Health Foods", "Buffet")))
.printResults()

replaceOne() 메서드를 사용할 때 UpdateOptions 문서를 포함하여 upsert 옵션 또는 bypassDocumentationValidation 옵션을 지정할 수 있습니다.

collection.replaceOne(
equal("name", "Orange Patisserie and Gelateria"),
Document("stars" -> 5, "contact" -> "TBD",
"categories" -> Seq("Cafe", "Pastries", "Ice Cream")),
UpdateOptions().upsert(true).bypassDocumentValidation(true))
.printResults()

컬렉션의 문서를 삭제하려면 deleteOne()deleteMany() 메서드를 사용할 수 있습니다.

필터 문서를 메서드에 전달하여 삭제할 문서를 지정할 수 있습니다. 필터 문서 사양은 읽기 작업과 동일합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters 헬퍼 클래스를 제공합니다.

빈 필터를 지정하고 컬렉션의 모든 문서를 일치시키려면 빈 Document 객체를 필터로 사용합니다.

deleteOne() 메서드는 필터 조건이 컬렉션의 여러 문서와 일치하더라도 최대 단일 문서를 삭제합니다.

restaurants 컬렉션에 대한 다음 작업은 _id 필드 값이 ObjectId("57506d62f57802807471dd41") 인 문서를 삭제합니다.

collection.deleteOne(equal("_id", new ObjectId("57506d62f57802807471dd41"))).subscribe(new ObservableSubscriber<DeleteResult>())

deleteMany() 메서드는 필터 조건과 일치하는 모든 문서를 삭제합니다.

restaurants 컬렉션에 대한 다음 작업은 stars 필드 값이 4 인 모든 문서를 삭제합니다.

collection.deleteMany(equal("stars", 4)).printResults()

쓰기 고려는 쓰기 작업에 대해 MongoDB에서 요청하는 승인 수준을 설명합니다.

다음 수준에서 쓰기 고려를 구성할 수 있습니다.

  • 다음과 같은 방법으로 MongoClient 에서:

    • MongoClientSettings 인스턴스를 생성합니다.

      val mongoClient: MongoClient = MongoClient(MongoClientSettings.builder()
      .applyConnectionString(ConnectionString("mongodb://host1,host2"))
      .writeConcern(WriteConcern.MAJORITY)
      .build())
    • ConnectionString 인스턴스를 생성합니다.

      val mongoClientt = MongoClient("mongodb://host1:27017,host2:27017/?w=majority")
  • withWriteConcern() 메서드를 사용하여 MongoDatabase 에서:

    val database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY)
  • withWriteConcern() 메서드를 사용하여 MongoCollection 에서:

    val collection = database.getCollection("restaurants").withWriteConcern(WriteConcern.MAJORITY)

MongoDatabase MongoCollection 인스턴스는 변경할 수 없습니다. 기존 MongoDatabase 또는 MongoCollection 인스턴스에서 withWriteConcern() 를 호출하면 새 인스턴스가 반환되며 메서드가 호출되는 인스턴스에는 영향을 주지 않습니다.

다음 예제에서 collWithWriteConcern 인스턴스의 쓰기 고려는 majority 인 반면, collection 의 읽기 설정은 영향을 받지 않습니다.

val collWithWriteConcern = collection.withWriteConcern(WriteConcern.MAJORITY)

읽기 고려, 읽기 설정 및 쓰기 고려의 조합을 포함하도록 MongoClientSettings, MongoDatabase 또는 MongoCollection 인스턴스를 빌드할 수 있습니다.

예를 들어 다음 코드는 컬렉션 수준에서 이 세 가지를 모두 설정합니다.

val collection = database.getCollection("restaurants")
.withReadPreference(ReadPreference.primary())
.withReadConcern(ReadConcern.MAJORITY)
.withWriteConcern(WriteConcern.MAJORITY)

돌아가기

사용 중 암호화