Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Scala드라이버
/

빠른 시작

이 가이드 의 코드 예제는 운전자 소스 코드 GitHub 리포지토리 의 QuickTour.scala 파일 에서 가져왔습니다.

참고

Scala 운전자 를 설치하는 방법에 대한 지침은 설치 가이드 를 참조하세요.

참고

이 가이드에서는 빠른 시작 입문서에서 다루는 Observable 암시를 사용합니다.

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

  • MongoDB의 기본 포트에서 실행되는 MongoDB 서버(27017)

  • 프로젝트에 설치된 드라이버 종속성

  • 다음 가져오기 문:

    import org.mongodb.scala._
    import org.mongodb.scala.model.Aggregates._
    import org.mongodb.scala.model.Filters._
    import org.mongodb.scala.model.Projections._
    import org.mongodb.scala.model.Sorts._
    import org.mongodb.scala.model.Updates._
    import org.mongodb.scala.model._
    import scala.collection.JavaConverters._

MongoClient 컴패니언 객체 사용하여 실행 MongoDB deployment 에 연결합니다.

MongoClient 인스턴스는 데이터베이스에 대한 연결 풀을 나타냅니다. 동시 작업 스레드를 사용하는 경우에도 MongoClient 인스턴스가 하나만 필요합니다.

중요

일반적으로 독립형 배포, 복제본 세트 또는 샤드 클러스터와 같은 특정 MongoDB 배포에 대해 MongoClient 인스턴스를 하나만 만들고 애플리케이션 전체에서 클라이언트를 사용합니다. 그러나 여러 인스턴스를 만드는 경우 다음 사항에 유의하세요.

  • 모든 리소스 사용량 제한(예: 최대 연결 수)은 각 MongoClient 인스턴스에 적용됩니다.

  • 인스턴스를 삭제하려면 MongoClient.close() 메서드를 호출하여 리소스를 정리합니다.

다음 예제는 단일 MongoDB deployment에 연결하는 여러 가지 방법을 보여줍니다.

다음과 같은 방법으로 단일 MongoDB deployment 에 연결할 수 있습니다.

  • 매개 변수 없이 MongoClient 객체를 인스턴스화하여 포트 27017 의 로컬 호스트에서 실행 중인 MongoDB 서버에 연결합니다.

    val mongoClient: MongoClient = MongoClient()
  • 포트 27017 의 지정된 호스트에서 실행 중인 MongoDB 인스턴스에 연결하려면 hostname 를 명시적으로 지정합니다.

    val mongoClient: MongoClient = MongoClient(
    MongoClientSettings.builder()
    .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("hostOne")).asJava))
    .build())
  • hostnameport 을 명시적으로 지정합니다.

    val mongoClient: MongoClient = MongoClient(
    MongoClientSettings.builder()
    .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("hostOne", 27017)).asJava))
    .build())
  • ConnectionString 을(를) 지정합니다.

    val mongoClient: MongoClient = MongoClient("mongodb://hostOne:27017")

MongoClient 인스턴스가 MongoDB 배포에 연결되면 MongoClient.getDatabase() 메서드를 사용하여 데이터베이스에 액세스합니다.

getDatabase() 메서드에 데이터베이스 이름을 지정합니다. 데이터베이스가 존재하지 않는 경우, 해당 데이터베이스에 대한 데이터를 처음 저장할 때 MongoDB가 데이터베이스를 생성합니다.

다음 예제에서는 mydb 데이터베이스에 액세스합니다.

val database: MongoDatabase = mongoClient.getDatabase("mydb")

MongoDatabase 인스턴스는 변경되지 않습니다.

MongoDatabase 인스턴스 가 있는 경우 getCollection() 메서드를 사용하여 컬렉션 에 액세스 합니다.

getCollection() 메서드에 컬렉션 이름을 지정합니다. 컬렉션 이 존재하지 않는 경우, 해당 컬렉션 에 대한 데이터를 처음 저장 때 MongoDB 가 컬렉션 을 생성합니다.

예를 예시, 데이터베이스 인스턴스 를 사용하여 다음 성명서 은 mydb 데이터베이스 의 test 컬렉션 에 액세스합니다.

val collection: MongoCollection[Document] = database.getCollection("test")

MongoCollection 인스턴스는 변경되지 않습니다.

운전자 사용하여 문서 만들려면 문서 클래스를 사용합니다.

예를 들어 다음 JSON document 를 가정해 보겠습니다.

{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : { x : 203, y : 102 }
}

운전자 를 사용하여 문서 를 만들려면 Document 객체 를 인스턴스화합니다.

val doc: Document = Document("_id" -> 0, "name" -> "MongoDB", "type" -> "database",
"count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))

MongoCollection 객체 가 있으면 컬렉션 에 문서를 삽입할 수 있습니다.

컬렉션 에 문서 를 삽입하려면 insertOne() 메서드를 사용합니다. 그런 다음 results() 암시적 헬퍼를 사용하여 관찰자가 완료될 때까지 차단 합니다.

collection.insertOne(doc).results()

경고

운전자 는 변경할 수 없는 Document 및 변경 가능한 Document 의 두 가지 문서 유형을 제공합니다.

변경할 수 없는 문서를 사용하는 경우 나중에 해당 _id 값을 알아야 하는 경우 명시적으로 _id 값을 추가해야 합니다.

문서 에 최상위 _id 필드 가 지정되지 않은 경우 MongoDB 는 자동으로 값을 생성하고 삽입된 문서 에 이 필드 를 추가하지만 해당 _id 는 사용자에게 다시 전달되지 않습니다.

중요

API 에서 Observable 인스턴스 를 반환하는 모든 메서드는 콜드 스트림이므로 구독할 때까지 아무 일도 일어나지 않습니다.

예를 들어 아래 예제에서는 아무 작업도 수행하지 않습니다.

val observable: Observable[InsertOneResult] = collection.insertOne(doc)

이 작업은 Observable 이(가) 구독되고 데이터가 요청된 경우에만 발생합니다.

observable.subscribe(new Observer[InsertOneResult] {
override def onSubscribe(subscription: Subscription): Unit = subscription.request(1)
override def onNext(result: InsertOneResult): Unit = println(s"onNext $result")
override def onError(e: Throwable): Unit = println("Failed")
override def onComplete(): Unit = println("Completed")
})

문서가 삽입되면 onNext() 메서드가 호출되고 onNext 과 그 결과가 차례로 출력됩니다. 마지막으로 onComplete() 메서드는 Completed 을 출력합니다. 어떤 이유로든 오류가 발생한 경우 onError() 메서드는 Failed 를 출력합니다.

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

다음 예에서는 다음 형식으로 여러 문서를 추가합니다.

{ "i" : value }

루프에서 문서를 만들어 documents 목록에 추가합니다.

val documents = (1 to 100) map { i: Int => Document("i" -> i) }

이러한 문서를 컬렉션에 삽입하려면 문서 목록을 insertMany() 메서드에 전달합니다.

val insertObservable = collection.insertMany(documents)

앞의 예시에서는 Observable 를 차단하여 완료합니다. 이렇게 하면 다음 작업이 실행되기 전에 데이터가 데이터베이스에 저장됩니다.

컬렉션 의 문서 수를 계산하려면 컬렉션의 count() 메서드를 사용할 수 있습니다. 다음 코드는 insertMany() 을 사용하여 100 삽입된 문서와 insertOne() 를 사용하여 삽입된 1 문서를 설명하는 101 를 출력해야 합니다.

for 컴프리헨션을 사용하여 두 작업을 함께 연결합니다. 다음 코드는 문서를 삽입한 다음 문서 수를 계산하고 결과를 출력합니다.

val insertAndCount = for {
insertResult <- insertObservable
countResult <- collection.countDocuments()
} yield countResult
println(s"Total # of documents: ${insertAndCount.headResult()}")

컬렉션을 쿼리 하려면 컬렉션 의 find() 메서드를 사용할 수 있습니다. 인수 없이 메서드를 호출하여 컬렉션 의 모든 문서를 쿼리 하거나 필터하다 를 전달하여 필터하다 기준과 일치하는 문서를 쿼리 할 수 있습니다.

컬렉션의 첫 번째 문서를 반환하려면 매개변수 없이 find() 메서드를 사용하고 first() 메서드를 연결합니다.

find().first() 구문은 단일 문서만 일치해야 하는 쿼리 또는 첫 번째 일치하는 문서에만 관심이 있는 경우에 유용합니다.

다음 예에서는 컬렉션에서 발견된 첫 번째 문서를 인쇄합니다.

collection.find().first().printHeadResult()

이 예제에서는 다음 문서가 출력되어야 합니다.

{
"_id" : { "$oid" : "551582c558c7b4fbacf16735" },
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : { "x" : 203, "y" : 102 }
}

참고

_id 요소는 MongoDB 에 의해 문서 에 자동으로 추가되었으며 사용자의 값은 표시된 것과 다를 수 있습니다. MongoDB 는 _$ 로 시작하는 필드 이름을 내부용으로 사용합니다.

컬렉션의 모든 문서를 검색하려면 find() 메서드를 사용합니다. find() 메서드는 찾기 작업을 연결하거나 제어하기 위한 유창한 인터페이스를 제공하는 FindObservable 인스턴스를 반환합니다. 다음 코드는 컬렉션의 모든 문서를 검색하고 인쇄합니다.

collection.find().printResults()

특정 조건과 일치하는 문서를 쿼리 하려면 필터하다 객체 를 find() 메서드에 전달합니다. 필터하다 객체를 쉽게 만들 수 있도록 운전자 는 Filters 헬퍼 메서드를 제공합니다.

i 필드 에 71 값이 있는 첫 번째 문서 를 찾으려면 eq() 필터하다 정의를 전달하여 동등 조건을 지정합니다.

collection.find(equal("i", 71)).first().printHeadResult()

이 예제에서는 하나의 문서를 인쇄합니다:

{ "_id" : { "$oid" : "..." }, "i" : 71 }

다음 예시 에서는 i 값이 50 보다 큰 모든 문서를 반환하고 인쇄합니다.

collection.find(gt("i", 50)).printResults()

범위에 대한 필터(예: 50 < i <= 100)를 지정하려면 and() 헬퍼를 사용할 수 있습니다.

collection.find(and(gt("i", 50), lte("i", 100))).printResults()

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

메서드에 다음 매개변수를 전달합니다.

  • 업데이트 할 문서 를 결정하기 위해 객체 를 필터링합니다. 필터하다 객체를 쉽게 만들 수 있도록 운전자 는 Filters 헬퍼 메서드를 제공합니다. 빈 필터하다 를 지정하고 컬렉션 의 모든 문서를 일치시키려면 빈 Document 객체 를 사용합니다.

  • 수정 사항을 지정하는 문서를 업데이트합니다. 사용 가능한 연산자 목록을 보려면 MongoDB Server 매뉴얼에서 업데이트 연산자 를 참조하세요.

업데이트 메서드는 업데이트로 수정된 문서 수를 포함하여 작업에 대한 정보를 제공하는 UpdateResult 유형을 반환합니다.

단일 문서를 업데이트하려면 updateOne() 메서드를 사용합니다.

다음 예시 에서는 i10 인 첫 번째 문서 를 업데이트하고 i 값을 110 로 설정합니다.

collection.updateOne(equal("i", 10), set("i", 110)).printHeadResult("Update Result: ")

쿼리 필터와 일치하는 모든 문서를 업데이트하려면 updateMany() 메서드를 사용합니다.

다음 예시 i 100 i 100에서는 값이 미만인 모든 문서에서 값을 만큼 증가시킵니다.

collection.updateMany(lt("i", 100), inc("i", 100)).printHeadResult("Update Result: ")

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

필터하다 객체 를 전달하여 삭제 문서 를 결정합니다. 필터하다 객체를 쉽게 만들 수 있도록 운전자 는 Filters 헬퍼 메서드를 제공합니다. 빈 필터하다 를 지정하고 컬렉션 의 모든 문서를 일치시키려면 빈 Document 객체 를 사용합니다.

삭제 메서드는 삭제된 문서 수를 포함하여 작업에 대한 정보를 제공하는 DeleteResult 을 반환합니다.

필터와 일치하는 단일 문서를 삭제하려면 deleteOne() 메서드를 사용합니다.

다음 예에서는 i 값이 110 인 첫 번째 문서를 삭제합니다.

collection.deleteOne(equal("i", 110)).printHeadResult("Delete Result: ")

필터하다 와 일치하는 모든 문서를 삭제 하려면 deleteMany() 메서드를 사용합니다.

다음 예시 에서는 i 값이 100 보다 크거나 같은 모든 문서를 삭제합니다.

collection.deleteMany(gte("i", 100)).printHeadResult("Delete Result: ")

필드에 인덱스를 만들려면 인덱스 사양 문서를 createIndex() 메서드에 전달합니다. 인덱스 키 사양 문서에는 다음 문서를 모델로 한 인덱싱할 필드와 각 필드의 인덱스 유형이 포함되어 있습니다.

Document(<field1> -> <type1>, <field2>, <type2>, ...)

오름차순 인덱스 유형을 생성하려면 <type>1 을 지정합니다. 내림차순 인덱스 유형을 생성하려면 <type>-1 를 지정합니다.

다음 예에서는 i 필드에 오름차순 인덱스를 생성합니다.

collection.createIndex(Document("i" -> 1)).printHeadResult("Create Index Result: %s")

다른 인덱스 유형 목록을 보려면 인덱스 생성 가이드 를 참조하세요.

빠른 시작(케이스 클래스 예제) 가이드 에서는 케이스 클래스와 함께 운전자 를 사용하는 방법을 설명합니다.

튜토리얼 섹션에서 추가 튜토리얼을 찾을 수 있습니다.

돌아가기

입문서: Reactive Streams 및 Observables