FAQ: MongoDB Fundamentals
이 페이지의 내용
이 문서에서는 MongoDB와 관련된 몇 가지 일반적인 질문에 대한 답변을 확인하실 수 있습니다.
MongoDB는 어떤 플랫폼을 지원하나요?
지원되는 플랫폼 목록은 플랫폼 지원을 참조하세요.
MongoDB는 호스팅 서비스로 제공되나요?
예. MongoDB Atlas는 클라우드에서 호스팅되는 서비스형 데이터베이스입니다. 자세한 내용은 MongoDB Atlas를 참조하세요.
컬렉션은 테이블과 어떻게 다른가요?
MongoDB database는 테이블 대신 컬렉션에 데이터를 저장합니다. 컬렉션에는 하나 이상의 BSON 문서가 있습니다. 문서는 관계형 데이터베이스 테이블의 레코드 또는 행에 비유할 수 있습니다. 각 문서에는 관계형 데이터베이스의 하나 이상의 필드가 있으며, 필드는 관계형 데이터베이스 테이블의 열과 유사합니다.
데이터베이스와 컬렉션은 어떻게 만들 수 있나요?
참고
이 FAQ에 참조된 명령은 MongoDB Shell
을 사용해 입력할 수 있습니다. MongoDB Shell은 MongoDB에 대한 인터랙티브 JavaScript 인터페이스입니다. MongoDB Shell을 사용하여 데이터를 쿼리 및 업데이트하고 관리 작업을 수행할 수 있습니다.
데이터베이스가 존재하지 않는 경우, 해당 데이터베이스에 대한 데이터를 처음 저장할 때 MongoDB가 데이터베이스를 생성합니다.
만약 컬렉션이 존재하지 않는다면 MongoDB는 해당 컬렉션의 데이터를 처음 저장할 때 컬렉션을 생성합니다.
따라서 존재하지 않는 데이터베이스(use <dbname>
)로 전환하여 다음 작업을 수행할 수 있습니다.
use myNewDB; db.myNewCollection1.insertOne( { x: 1 } ); db.myNewCollection2.createIndex( { a: 1 } );
db.collection.insertOne()
메서드는 컬렉션myNewCollection1
이(가) 아직 없는 경우 이를 생성합니다.db.collection.createIndex()
메소드는 인덱스와 컬렉션myNewCollection2
이(가) 아직 존재하지 않는 경우 이를 생성합니다.myNewDb
데이터베이스가 존재하지 않는다면db.collection.createIndex()
메서드 또는db.collection.insertOne()
메서드가 자동으로myNewDb
데이터베이스를 생성했을 것입니다.
최대 크기 또는 문서 유효성 검사 규칙과 같은 특정 옵션을 지정하려는 경우 db.createCollection()
메서드를 사용하여 명시적으로 을 컬렉션만들 수도 있습니다.
use myNewDB; db.createCollection("myNewCollection1");
컬렉션 스키마를 정의하거나 변경하려면 어떻게 해야 하나요?
MongoDB에서 컬렉션에 대한 스키마를 지정할 필요가 없습니다. 컬렉션의 문서가 대체로 동일한 집합을 갖는 것이 일반적이지만, 이는 필수 사항은 아닙니다. 즉, 단일 컬렉션의 문서가 동일한 필드 집합을 가질 필요는 없습니다. 필드의 데이터 유형은 컬렉션의 문서마다 다를 수 있습니다.
컬렉션의 문서 구조를 변경하려면 문서를 새 구조로 업데이트하세요. 예를 들어 새 필드를 추가하거나, 기존 필드를 제거하거나, 필드 값을 새 유형으로 업데이트할 수 있습니다.
참고
업데이트 및 삽입 작업 중에 컬렉션에 대한 문서 유효성 검사 규칙을 시행할 수 있습니다.
최대 크기 지정과 같은 일부 컬렉션 속성은 컬렉션을 명시적으로 생성하는 동안 지정하고 수정할 수 있습니다. db.createCollection()
및 collMod
를 참조하세요. 이러한 속성을 지정하지 않으면 컬렉션에 데이터를 처음 저장할 때 MongoDB가 새 컬렉션을 생성하므로 컬렉션을 명시적으로 생성할 필요가 없습니다.
MongoDB는 SQL을 지원하나요?
직접적으로는 아닙니다. 하지만 MongoDB는 자체적으로 풍부한 쿼리 언어를 지원합니다. MongoDB의 쿼리 언어 사용에 대한 예시는 MongoDB CRUD 작업을 참조하세요.
MongoDB Connector for BI를 사용해 MongoDB 컬렉션을 SQL로 쿼리할 수도 있습니다.
SQL 애플리케이션을 MongoDB로 마이그레이션하려는 경우 MongoDB 애플리케이션 현대화 가이드응 다운로드하여 권장사항 마이그레이션 가이드,참조 스키마 및 기타 유용한 리소스를 확인해보세요.
MongoDB가 ACID 트랜잭션을 지원합니까?
단일 문서에는 관계형 스키마에서 별도의 상위-하위 테이블에 걸쳐 모델링되는 관련 데이터가 포함될 수 있기 때문에, MongoDB의 원자적 단일 문서 작업은 이미 대다수 애플리케이션의 데이터 무결성 요구 사항을 충족하는 트랜잭션 시맨틱을 제공하고 있습니다. 배열의 여러 하위 문서 및 요소에 대한 업데이트를 포함하여 하나 이상의 필드를 단일 작업으로 작성할 수 있습니다. MongoDB는 문서가 업데이트될 때 완전한 격리를 보장합니다. 오류가 발생하면 작업이 롤백되어 클라이언트가 일관된 문서 보기를 받을 수 있습니다.
여러 문서(단일 또는 여러 컬렉션)에 대한 읽기 및 쓰기의 원자성이 필요한 상황의 경우, 복제본 세트 및 샤딩된 클러스터에서의 트랜잭션을 포함한 분산 트랜잭션을 지원합니다.
자세한 내용은 트랜잭션을 참조하세요.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
MongoDB는 캐싱을 처리하나요?
예. MongoDB는 가장 최근에 사용한 데이터를 RAM에 보관합니다. 쿼리에 대한 인덱스를 생성하고 작업 데이터 세트가 RAM에 맞으면 MongoDB는 메모리에서 모든 쿼리를 처리합니다.
MongoDB는 동일한 쿼리에 대해 캐시된 결과를 반환하기 위해 쿼리 결과를 캐시하지 않습니다.
MongoDB 및 메모리 사용에 대한 자세한 내용은 WiredTiger 및 메모리 사용을참조하세요.
MongoDB는 SQL 또는 쿼리 주입을 어떻게 처리하나요?
BSON
클라이언트 프로그램이 MongoDB에서 쿼리를 어셈블할 때, 문자열이 아닌 BSON 객체를 빌드합니다. 따라서 기존의 SQL 인젝션 공격은 문제가 되지 않습니다. 자세한 내용과 몇 가지 뉘앙스는 아래에서 설명합니다.
MongoDB는 쿼리를 BSON 객체로 나타냅니다. 일반적으로 클라이언트 라이브러리는 이러한 객체를 빌드하기 위한 편리하고 주입이 필요 없는 프로세스를 제공합니다. 다음 C++ 예시를 고려합니다.
BSONObj my_query = BSON( "name" << a_name ); auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", my_query);
여기서 my_query
는 { name : "Joe"
}
과 같은 값을 갖습니다. my_query
에 특수 문자(예시: ,
, :
, {
)가 포함된 경우 쿼리는 어떤 문서와도 일치하지 않습니다. 예를 들어, 사용자는 쿼리를 가로채서 삭제로 변환할 수 없습니다.
JavaScript
참고
JavaScript의 모든 서버 측 실행을 비활성화할 수 있습니다.
mongod
인스턴스의 경우 명령줄에--noscripting
옵션을 전달하거나 구성 파일에서security.javascriptEnabled
를 false로 설정합니다.mongos
인스턴스의 경우 명령줄에--noscripting
옵션을 전달하거나 구성 파일에서security.javascriptEnabled
를 false로 설정합니다.
다음과 같은 MongoDB 작업을 통해 서버에서 직접 임의의 JavaScript 표현식을 실행할 수 있습니다.
이러한 경우 사용자가 악성 JavaScript를 제출하지 못하도록 주의해야 합니다.
다행히 JavaScript 없이도 MongoDB에서 대부분의 작업을 표현할 수 있습니다.