문서 메뉴

문서 홈보기 & 데이터 분석MongoDB Shell

스크립트 작성하기

이 페이지의 내용

  • 호환성
  • JavaScript 파일 실행하기
  • mongosh 내에서 스크립트 실행하기
  • 명령줄에서 스크립트 실행하기
  • 명령줄에서 인증으로 스크립트 실행하기
  • 오류 발생 시 스크립트 종료
  • 구성 파일에서 코드 실행하기
  • JavaScript 코드 실행하기
  • MongoDB 코드 실행하기
  • JavaScript 및 MongoDB 코드 실행하기
  • 새 연결 열기
  • 로컬 MongoDB 인스턴스에 연결하기
  • Atlas 배포서버에 연결하기
  • 액세스 제어를 실행하는 MongoDB 인스턴스에 연결하기
  • connect()을(를) 사용하여 MongoDB 인스턴스에 연결하기
  • 연결 고려사항

MongoDB의 데이터를 수정하거나 관리 작업을 수행하는 MongoDB Shell 전용 스크립트를 작성할 수 있습니다. 또한 스크립트를 스니펫으로 패키징하여 배포 및 관리를 용이하게 할 수도 있습니다.

이 튜토리얼에서는 JavaScript와 MongoDB 셸을 사용하여 MongoDB에 액세스하는 방법을 소개합니다.

다음 환경에서 호스팅되는 MongoDB 배포서버 셸에 대한 스크립트를 작성할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

  • MongoDB Enterprise: 구독 기반의 자체 관리형 MongoDB 버전입니다.

  • MongoDB Community: 소스 사용 가능하고, 무료로 사용할 수 있는 자체 관리형 MongoDB 버전

MongoDB Atlas에서 호스팅되는 배포에 MongoDB Shell을 사용하는 방법에 대해 자세히 알아보려면 mongosh를 통한 연결을 참조하세요.

load() 메서드를 사용하여 MongoDB Shell 내에서 .js 파일을 실행할 수 있습니다.

load() 메서드는 상대 경로와 절대 경로를 허용합니다. MongoDB Shell의 현재 작업 디렉토리가 /data/db(이)고 connect-and-insert.js이(가) /data/db/scripts 디렉토리에 있는 경우, MongoDB Shell 내에서 서로 동일한 호출은 다음과 같습니다.

load( "scripts/connect-and-insert.js" )
load( "/data/db/scripts/connect-and-insert.js" )

다음 예제에서는 아래와 같은 스크립트를 작성하고 실행합니다.

  • 기본 포트에서 실행 중인 로컬 인스턴스에 연결됩니다.

  • myDatabase 데이터베이스에 연결됩니다.

  • movies 컬렉션을 샘플 문서로 채웁니다.

  1. 다음 내용으로 connect-and-insert.js(이)라는 이름의 파일을 생성하세요.

    db = connect( 'mongodb://localhost/myDatabase' );
    db.movies.insertMany( [
    {
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ] )
  2. connect-and-insert.js 파일을 로드하고 실행하려면 mongosh을(를) 사용하여 배포서버에 연결하고 다음 명령을 실행하세요.

    load( "connect-and-insert.js" )
  3. 문서가 올바르게 로드되었는지 확인하려면 myDatabase 컬렉션을 사용해서 movies 컬렉션을 쿼리하세요.

    use myDatabase
    db.movies.find()

참고

load () 메서드에는 검색 경로가 없습니다. 타겟 스크립트가 현재 작업 디렉토리나 지정된 전체 경로에 없으면 MongoDB Shell이 파일에 액세스할 수 없습니다.

mongosh 콘솔을 시작하지 않고도 mongosh을(를) 사용하여 명령줄에서 스크립트를 실행할 수 있습니다.

파일 이름을 지정하려면 --file 또는 -f 매개변수를 사용하여 파일 이름을 지정하세요. --file 또는 -f 매개변수 이외의 연결 정보를 지정해야 할 수도 있습니다.

매개변수 플래그를 사용하지 않은 상태에서 파일 이름을 mongosh(으)로 전달할 경우, 다른 명령줄 인수가 있으면 연결이 실패할 수 있습니다.

파일 이름을 전달하려면 항상 --file 또는 -f을(를) 사용하세요.

다음 예에서는 스크립트를 생성해 명령줄에서 실행합니다.

  • loadMovies.jsinsertMany() 를 사용하여 로컬 MongodDB 인스턴스를 업데이트합니다.

  • queryMovies.js db.collection.find() 을(를) 사용하여 업데이트를 확인합니다.

  1. 이 스크립트를 복사해서 loadMovies.js(으)로 저장하세요.

    db = connect( 'mongodb://localhost/films' );
    db.movies.insertMany( [
    {
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ] )

    강조 표시된 행의 연결 문자열을 확인하세요. MongoDB 인스턴스가 localhost:27017에서 실행되고 있지 않은 경우에는 연결 문자열을 편집해야 합니다.

    그 예로 다음 연결 문자열은 localhost 포트 27500에 연결됩니다.

    db = connect( 'mongodb://localhost:27500/films' );
  2. 이 스크립트를 복사해서 queryMovies.js(으)로 저장하세요.

    db = connect( 'mongodb://localhost/films' );
    printjson( db.movies.find( {} ) );
  3. 명령줄에서 스크립트를 실행하세요.

    mongosh --file loadMovies.js --file queryMovies.js
  4. 결과를 확인하세요.

    Loading file: loadMovies.js
    Loading file: queryMovies.js
    [
    {
    _id: ObjectId("616f1b8092dbee425b661117"),
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    _id: ObjectId("616f1b8092dbee425b661118"),
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    _id: ObjectId("616f1b8092dbee425b661119"),
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ]

    db.collection.find() 명령의 출력은 movies 컬렉션이 업데이트되었음을 보여줍니다.

    출력을 표시하려면 printjson() 를 사용하여 db.collection.find() 를 호출합니다.

    printjson( db.movies.find( {} ) ) ;

인증이 필요한 원격 mongod 인스턴스에 대해 스크립트를 실행하려면 파일 이름 외에 연결 및 인증 세부 정보를 지정합니다.

예를 들면 다음과 같습니다.

mongosh --host 172.17.0.3 --port 27500 --username filmFan --password superSecret --file loadMovies.js

다음과 같이 옵션을 축약된 형식으로 지정할 수도 있습니다.

mongosh --host 172.17.0.3 --port 27500 -u filmFan -p superSecret -f loadMovies.js

bashzsh 등의 셸에서 공백으로 명령을 시작하면 해당 명령이 명령 기록에 저장되지 않습니다. 이렇게 하면 명령줄에 비밀번호를 입력할 때 노출이 최소화됩니다.

예외가 발생하거나 예상치 못한 결과가 발생한 경우 실행 중인 스크립트를 종료하는 것이 유용한 경우가 많습니다. 스크립트의 특정 지점에서 종료하면 불필요한 코드가 실행되고 잠재적으로 예상치 못한 결과가 발생하는 것을 방지할 수 있습니다.

스크립트를 종료하려면 exit(<code>) 메서드를 호출할 수 있습니다. 여기서 <code>는 사용자 지정 값입니다.

가장 좋은 방법은 catch 블록에서 exit 메서드를 호출하여 코드를 try - catch로 래핑하는 것입니다. 마찬가지로 쿼리 또는 명령의 결과를 확인하려면 if - else 문을 추가하고 결과가 예상과 다를 경우 exit 메서드를 호출할 수 있습니다.

mongosh은(는) 시작 시 HOME 디렉토리에 .mongoshrc.js(이)라는 이름의 JavaScript 파일이 있는지 확인합니다. 이 파일이 발견되면 mongosh이(가) .mongoshrc.js의 내용을 읽은 후에 처음으로 프롬프트를 표시합니다.

다음도 참조하세요.

행 번호가 표시되도록 mongosh 프롬프트를 업데이트하려면 <your-home-directory>/.mongoshrc.js에 다음 코드를 추가하세요.

let cmdCount = 1;
prompt = function() {
return (cmdCount++) + "> ";
}

이 프롬프트는 다음과 같이 표시됩니다.

1> show collections
2> use test
3>

mongosh 클라이언트가 데이터베이스에 연결될 때의 로그를 생성하려면 <your-home-directory>/.mongoshrc.js에 다음 코드를 추가하세요.

db.clientConnections.insertOne( { connectTime: ISODate() } )

MongoDB 서버는 데이터베이스에 연결될 때마다 다음 내용과 같은 문서를 clientConnections 컬렉션에 추가합니다.

{
_id: ObjectId("61d4bbf0fa4c85f53418070f"),
connectTime: ISODate("2022-01-04T21:28:16.367Z")
}

현재의 데이터베이스 이름은 기본 mongosh 프롬프트의 일부입니다. 데이터베이스 및 호스트 이름이 표시되도록 프롬프트의 형식을 다시 지정하려면 다음과 같은 함수를 사용하세요.

{
const hostnameSymbol = Symbol('hostname');
prompt = () => {
if (!db[hostnameSymbol])
db[hostnameSymbol] = db.serverStatus().host;
return `${db.getName()}@${db[hostnameSymbol]}> `;
};
}

이 프롬프트는 다음과 같이 표시됩니다.

admin@centos0722:27502>

MongoDB Shell 또는 JavaScript 파일에서 Mongo() 메서드를 사용하여 데이터베이스 연결을 인스턴스화할 수 있습니다.

new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)

참고

MongoDB Shell은 메서드가 포함된 ClientSideFieldLevelEncryptionOptions 문서를 Mongo() 지원하지 않습니다.

기본 포트의 로컬 호스트에서 MongoDB 인스턴스를 실행하는 것이 좋습니다.

다음 예제입니다.

  • 해당 인스턴스에 대한 새 연결을 인스턴스화한 다음,

  • Mongo.getDB() 메서드를 사용하여 글로벌 db 변수를 myDatabase (으)로 설정합니다.

conn = Mongo();
db = conn.getDB("myDatabase");

MongoDB Atlas에서 호스팅되는 배포서버에 연결하려면 Atlas 연결 문자열과 함께 mongosh 명령을 실행하세요. 예:

mongosh "mongodb+srv://YOUR_CLUSTER_NAME.YOUR_HASH.mongodb.net/" --apiVersion YOUR_API_VERSION --username YOUR_USERNAME

배포서버에 대한 연결을 설정한 후에는 MongoDB 셸에서 바로 데이터베이스 연결을 인스턴스화할 수 있습니다.다음 예제입니다.

  • db.getMongo() 메서드를 사용하여 현재 배포에 대한 연결을 인스턴스화합니다.

  • Mongo.getDB() 메서드를 사용하여 글로벌 db 변수를 myDatabase (으)로 설정합니다.

conn = db.getMongo()
db = conn.getDB("myDatabase");

액세스 제어를 적용하는 MongoDB 인스턴스에 연결하려면 연결 문자열에 자격 증명을 포함해야 합니다.

다음 명령은 다음과 같은 MongoDB 인스턴스에 연결됩니다.

conn = Mongo("mongodb://<username>:<password>@localhost:27017/<authDB>");

참고

MongoDB Shell은 명령 기록로그에서 자격 증명을 삭제합니다.

connect() 메서드를 사용하여 MongoDB 인스턴스에 연결할 수도 있습니다.

다음 명령을 입력합니다.

  • 기본 포트가 아닌 27020 포트를 사용하여 localhost에서 실행 중인 MongoDB 인스턴스에 연결합니다. 또한

  • 글로벌 db 변수를 설정합니다.

db = connect("localhost:27020/myDatabase");

스크립트를 작성할 때는 이식성과 운영 환경을 고려합니다.

연결 세부 정보가 스크립트에 포함된 경우입니다.

  • 명령줄에서 연결 정보를 지정하지 않아도 됩니다.

  • --nodb 매개 변수를 사용해야 합니다.

localhost:27500 에서 실행 중인 mongod 인스턴스를 생각해 보세요.

다음 스크립트는 사용자 수를 출력합니다. 이 코드를 복사해서 getUserCount.js(으)로 저장하세요.

db = connect( "localhost:27500/admin" );˘
printjson( db.system.users.countDocuments() );

다음과 같이 getUserCount.js을(를) 실행하세요.

mongosh --nodb --file getUserCount.js
  • mongosh 포트 27170으로 기본 설정됩니다.

  • mongod 포트 27500에서 실행 중입니다.

  • 매개변수는 인스턴스에 --nodb mongosh 먼저 연결하지 않고 스크립트를 mongod 실행하도록 에 지시합니다.

강조 표시된 행이 올바르기는 하지만 mongosh이(가) 로컬 인스턴스에 연결될 수 없으므로, --nodb 없이는 getUserCount.js이(가) 실행되지 않습니다. --nodb가 있으면 mongosh이(가) getUserCount.js을(를) 실행하고 강조 표시된 정보를 사용하여 연결합니다.

스크립트에 연결 정보를 입력하면 편리하지만 이식성이 낮아지기도 합니다. getUserCount.js 스크립트는 업데이트해야 원격 인스턴스에서 실행하거나 다른 포트에서 실행할 수 있습니다.

이식성을 높이려면 db.getSiblingDB() 를 사용하고 명령줄에 연결 정보를 지정합니다.

다음 스크립트는 특정 연결 세부 정보가 없으므로 getUserCount.js보다 이식성이 우수합니다. 이 코드를 복사해서 portableGetUserCount.js(으)로 저장하세요.

db = db.getSiblingDB( "admin" );
printjson( db.system.users.countDocuments() );

portableGetUserCount.js을(를) 실행하려면 다음과 같이 명령줄에 호스트 및 포트를 지정하세요.

mongosh --host 172.17.0.3 --port 27500 --file portableGetUserCount.js

다른 호스트 또는 포트에서 portableGetUserCount.js을(를) 실행하려면 명령줄에서 연결 세부 정보를 변경하세요. getUserCount.js와(과) 달리, portableGetUserCount.js을(를) 실행할 때는 스크립트를 편집할 필요가 없습니다.

← Client-Side Field Level Encryption