Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

트랜잭션 및 작업

이 페이지의 내용

  • 다중 문서 트랜잭션에서 지원되는 작업
  • CRUD 작업
  • 카운트 연산
  • 차별화된 운영
  • 관리 운영
  • 정보 운영
  • 제한된 작업

거래의 경우:

  • 트랜잭션에서 컬렉션과 인덱스를 생성할 수 있습니다. 자세한 내용은 트랜잭션에서 컬렉션 및 인덱스 만들기를 참조하세요.

  • 트랜잭션에 사용되는 컬렉션은 서로 다른 데이터베이스에 있을 수 있습니다.

    참고

    샤드 간 쓰기 트랜잭션에서는 새 컬렉션을 생성할 수 없습니다. 예를 들어, 하나의 샤드에서 기존 컬렉션에 쓰고 다른 샤드에서 암시적으로 새 컬렉션을 생성하는 경우, MongoDB는 동일한 트랜잭션에서 두 작업을 모두 수행할 수 없습니다.

  • 제한된 컬렉션에는 쓸 (write) 수 없습니다.

  • 제한된 컬렉션에서 읽을 때는 읽기 고려 "snapshot"을(를) 사용할 수 없습니다. (MongoDB 5.0부터 도입됨)

  • config, admin 또는 local 데이터베이스의 컬렉션을 읽고 쓸 수 없습니다.

  • system.* 컬렉션에 쓸 수 없습니다.

  • explain 또는 이와 유사한 명령을 사용하여 지원되는 작업의 쿼리 계획을 반환할 수 없습니다.

  • 트랜잭션 외부에서 생성된 커서의 경우 트랜잭션 내부에서 getMore을(를) 호출할 수 없습니다.

  • 트랜잭션에서 생성된 커서의 경우 트랜잭션 외부에서 getMore를 호출할 수 없습니다.

  • 명령을 트랜잭션 의 killCursors 첫 번째 작업으로 지정할 수 없습니다.

    또한 트랜잭션 내에서 killCursors 명령을 실행 하면 서버 가 지정된 커서를 즉시 중지합니다. 트랜잭션 이 커밋 될 때까지 기다리지 않습니다.

트랜잭션에서 허용되는 읽기/쓰기 작업은 다음과 같습니다.

메서드
명령
참고

다음 쿼리 연산자 표현식은 제외됩니다.

이 메서드는 쿼리에 $match 집계 단계를 사용하고 $sum 표현식이 있는 $group 집계 단계를 사용하여 계산을 수행합니다.

비샤드형 컬렉션에서 사용할 수 있습니다.

For sharded collections, use the aggregation pipeline with the $group stage. See Distinct Operation.

존재하지 않는 컬렉션에서 upsert: true 를 사용하여 업데이트 또는 교체 작업을 실행하면 컬렉션이 암시적으로 생성됩니다.

자세한 내용은 관리 작업을 참조하세요.

존재하지 않는 컬렉션에서 실행하면 컬렉션이 암시적으로 생성됩니다.

자세한 내용은 관리 작업을 참조하세요.

존재하지 않는 컬렉션에서 실행하면 컬렉션이 암시적으로 생성됩니다.

자세한 내용은 관리 작업을 참조하세요.

존재하지 않는 컬렉션에서 실행하면 컬렉션이 암시적으로 생성됩니다.

자세한 내용은 관리 작업을 참조하세요.

참고

샤드 키 값 업데이트

트랜잭션에서 또는 재시도 가능 쓰기로 단일 문서 업데이트/찾기 및 수정(update/findAndModify) 작업을 실행해 문서의 샤드 키 값을 업데이트할 수 있습니다(샤드 키 필드가 변경 불가능한 _id 필드인 경우 제외). 자세한 내용은 문서의 샤드 키 값 변경에서 확인하세요.

트랜잭션 내에서 카운트 연산을 수행하려면 $count 집계 단계 또는 $group($sum 표현식 포함) 집계 단계를 사용합니다.

MongoDB 드라이버는 $sum 표현식과 함께 $group를 사용하여 카운트를 수행하는 헬퍼 메서드로서 컬렉션 수준 API countDocuments(filter, options)을 제공합니다.

mongosh$sum 표현식과 함께 $group을 사용하여 카운트를 수행하는 헬퍼 메서드 db.collection.countDocuments()를 제공합니다.

트랜잭션 내에서 고유한 작업을 수행합니다.

  • 샤드되지 않은 컬렉션의 경우, db.collection.distinct() 메서드/distinct 명령과 $group 단계의 집계 파이프라인을 사용할 수 있습니다.리

  • 샤드된 컬렉션의 경우 db.collection.distinct() 메서드 또는 distinct 명령을 사용할 수 없습니다.

    샤딩된 컬렉션의 고유 값을 찾으려면 대신 $group 단계의 집계 파이프라인을 사용합니다. 예시:

    • db.coll.distinct("x")0} 대신 다음을 사용합니다.

      db.coll.aggregate([
      { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
      { $project: { _id: 0 } }
      ])
    • db.coll.distinct("x", { status: "A" })0} 대신 다음을 사용합니다.

      db.coll.aggregate([
      { $match: { status: "A" } },
      { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
      { $project: { _id: 0 } }
      ])

    파이프라인은 문서에 커서를 반환합니다.

    { "distinctValues" : [ 2, 3, 1 ] }

    커서를 반복하여 결과 문서에 액세스합니다.

트랜잭션이 교차 샤드 쓰기 트랜잭션(write transaction)인 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.

명령
메서드
참고 사항
암시적 생성 작업도 참조하세요.
생성할 인덱스는 컬렉션이 작업의 일부로 생성된 경우 존재하지 않는 컬렉션에 있어야 하며, 또는 동일한 트랜잭션에서 이전에 생성된 빈 신규 컬렉션에 있어야 합니다.

참고

트랜잭션 내에서 컬렉션이나 인덱스를 명시적으로 만들려면 트랜잭션 읽기 고려 수준이 "local"여야 합니다.

트랜잭션에서 컬렉션 및 인덱스 만드는 방법에 대한 자세한 내용은 트랜잭션에서 컬렉션 및 인덱스 생성을 참조하세요.

존재하지 않는 컬렉션에 대해 다음과 같은 쓰기 작업을 통해 컬렉션을 암시적으로 만들 수도 있습니다.

존재하지 않는 컬렉션에 대해 메서드 실행
존재하지 않는 컬렉션에 대해 명령 실행
findAndModifyupsert: true
db.collection.updateOne() with upsert: true
db.collection.updateMany() with upsert: true
db.collection.replaceOne() with upsert: true
updateupsert: true
db.collection.bulkWrite() with insert or upsert:true operations
Various Bulk Operation Methods with insert or upsert:true operations

트랜잭션에서 허용되는 다른 CRUD 작업은 CRUD 작업에서 확인하세요.

트랜잭션에서 컬렉션 및 인덱스 만드는 방법에 대한 자세한 내용은 트랜잭션에서 컬렉션 및 인덱스 생성을 참조하세요.

2} buildInfo,helloconnectionStatus , 과 같은 정보 명령(및 그 도우미 메서드) (및 해당 헬퍼 메서드)와 같은 정보 명령은 트랜잭션에서 허용되지만, 트랜잭션의 첫 번째 연산이 될 수는 없습니다.

트랜잭션에서 허용되지 않는 작업은 다음과 같습니다.

다음도 참조하세요.

돌아가기

드라이버 API