복붙노트

[MONGODB] 어떻게 쉘 스크립트를 통해 몽고 명령을 실행합니다?

MONGODB

어떻게 쉘 스크립트를 통해 몽고 명령을 실행합니다?

나는 쉘 스크립트, 예를 들어,에 몽고 명령을 실행하려면 스크립트 test.sh에서 :

#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections

내가 ./test.sh를 통해이 스크립트를 실행하면 다음 MongoDB에 대한 연결이 설정되어 있지만, 다음과 같은 명령이 실행되지 않습니다.

어떻게 쉘 스크립트 test.sh을 통해 다른 명령을 실행합니다?

해결법

  1. ==============================

    1.그것은 단지 하나의 명령 인 경우 당신은 또한 --eval 플래그를 사용하여 명령을 평가할 수 있습니다.

    그것은 단지 하나의 명령 인 경우 당신은 또한 --eval 플래그를 사용하여 명령을 평가할 수 있습니다.

    mongo --eval "printjson(db.serverStatus())"
    

    참고 :이 $ 기호로 시작, 몽고 연산자를 사용하는 경우, 당신은 환경 변수로 운영자 평가에서 쉘을 유지하기 위해 작은 따옴표로 평가 인수를 둘러싸고 싶을 것이다 :

    mongo --eval 'db.mycollection.update({"name":"foo"},{$set:{"this":"that"}});' myDbName
    

    그렇지 않으면이 같은 것을 볼 수 있습니다 :

    mongo --eval "db.test.update({\"name\":\"foo\"},{$set:{\"this\":\"that\"}});"
    > E QUERY    SyntaxError: Unexpected token :
    
  2. ==============================

    2.은 .js 파일로 몽고 스크립트를 넣습니다.

    은 .js 파일로 몽고 스크립트를 넣습니다.

    이어서 몽고

    전의:

    demo.js // 파일은 스크립트가 있습니다

    use sample  //db name
    show collections
    

    이 파일을 보관 "C : \ DB-스크립트"

    그런 다음에 cmd를 프롬프트 이동에서 "C : \ DB-스크립트"

    C:\db-scripts>mongo < demo.js
    

    이것은 몽고 및 표시 출력 코드를 실행할

    C:\db-scripts>mongo < demo.js
    Mongo shell version: 3.0.4
    Connecting to: test
    switched to db sample
    users   //collection name
    tasks   //collection name
    bye
    C:\db-scripts>
    
  3. ==============================

    3.이것은 리눅스에서 나를 위해 작동합니다 :

    이것은 리눅스에서 나를 위해 작동합니다 :

    mongo < script.js
    
  4. ==============================

    4.라는 파일 test.js이 넣어 :

    라는 파일 test.js이 넣어 :

    db.mycollection.findOne()
    db.getCollectionNames().forEach(function(collection) {
      print(collection);
    });
    

    다음 몽고 myDbName test.js.으로 실행

  5. ==============================

    5.뿐만 아니라이에 대한 공식 문서 페이지가있다.

    뿐만 아니라이에 대한 공식 문서 페이지가있다.

    해당 페이지에서 예는 다음과 같습니다

    mongo server:27017/dbname --quiet my_commands.js
    mongo test --eval "printjson(db.getCollectionNames())"
    
  6. ==============================

    6.아래의 쉘 스크립트는 나를 위해 잘 작동 ... 명확한는 안토닌 처음에 언급 한 리디렉션 ... 나에게 여기 문서를 테스트 할 수있는 아이디어를 준 사용했다.

    아래의 쉘 스크립트는 나를 위해 잘 작동 ... 명확한는 안토닌 처음에 언급 한 리디렉션 ... 나에게 여기 문서를 테스트 할 수있는 아이디어를 준 사용했다.

    function testMongoScript {
        mongo <<EOF
        use mydb
        db.leads.findOne()
        db.leads.find().count()
    EOF
    }
    
  7. ==============================

    7.내 설정에서 나는 사용해야합니다 :

    내 설정에서 나는 사용해야합니다 :

    mongo --host="the.server.ip:port" databaseName theScript.js 
    
  8. ==============================

    8.나는 다윗 젊은 언급은 "히어 닥"구문을 사용합니다. 그러나 캐치가있다 :

    나는 다윗 젊은 언급은 "히어 닥"구문을 사용합니다. 그러나 캐치가있다 :

    #!/usr/bin/sh
    
    mongo <db> <<EOF
    db.<collection>.find({
      fieldName: { $exists: true }
    })
    .forEach( printjson );
    EOF
    

    문구가 쉘 볼과라는 이름의 환경 변수의 값으로 대체 될 것 "존재 $"때문에 위하지 않습니다 일, "존재한다." 어떤 가능성 때문에 쉘 확장 후에는되고, 존재하지 않는 :

    #!/usr/bin/sh
    
    mongo <db> <<EOF
    db.<collection>.find({
      fieldName: { : true }
    })
    .forEach( printjson );
    EOF
    

    당신은 두 가지 옵션을 통해이하기 위해서는 그것을 전달합니다. 하나 하나가 아주 좋은, 추한입니다. 첫째, 추한 하나는 $ 표시를 탈출 :

    #!/usr/bin/sh
    
    mongo <db> <<EOF
    db.<collection>.find({
      fieldName: { \$exists: true }
    })
    .forEach( printjson );
    EOF
    

    이 탈출하는 것을 잊지 쉽게 때문에,이 사용하지 않는 것이 좋습니다.

    다른 옵션은이처럼 EOF를 탈출하는 것입니다 :

    #!/usr/bin/sh
    
    mongo <db> <<\EOF
    db.<collection>.find({
      fieldName: { $exists: true }
    })
    .forEach( printjson );
    EOF
    

    지금, 당신은 당신의 히어 닥 당신이 원하는 모든 달러 기호를 넣을 수 있고, 달러 기호는 무시됩니다. 아래쪽 측면 : 당신이 당신의 몽고 스크립트에서 쉘 매개 변수 / 변수를 넣어해야하는 경우 문제가 해결되지 않습니다.

    당신이 놀 수있는 또 다른 옵션은 오두막 엉망이다. 예를 들어,

    #!/bin/env mongo
    <some mongo stuff>
    

    이 솔루션에 여러 가지 문제가 있습니다 :

    나는 당신이 일 것이라고 생각 것 오두막에 데이터베이스 이름을 추가 노력했다. 불행하게도, (인용 것처럼) 첫 번째 공간이 ENV 명령에 하나의 매개 변수로 전달 된 후 방식 시스템은 오두막 라인, 모든 것을 처리하고 ENV 찾아 실행하는 데 실패합니다.

    대신, 스크립트 자체 내에서 데이터베이스 변경을 포함과 같이해야합니다 :

    #!/bin/env mongo
    db = db.getSiblingDB('<db>');
    <your script>
    

    인생에서 아무것도처럼, "그것을 하나 개 이상의 방법이있다!"

  9. ==============================

    9.혹시 인증을 사용하도록 설정 :

    혹시 인증을 사용하도록 설정 :

    mongo -u username -p password --authenticationDatabase auth_db_name < your_script.js
    
  10. ==============================

    10.스크립트 파일을 생성; 쓰기 명령 :

    스크립트 파일을 생성; 쓰기 명령 :

    #!/bin/sh
    mongo < file.js
    

    file.js에 몽고의 쿼리를 작성 :

    db.collection.find({"myValue":null}).count();
    
  11. ==============================

    11.이건 어때요:

    이건 어때요:

    echo "db.mycollection.findOne()" | mongo myDbName
    echo "show collections" | mongo myDbName
    
  12. ==============================

    12.기본 DB에 예비 작업에 노력하지 않으면 theTuxRacer에 의해 제안으로, 당신은 내가처럼 그것을 누락 사람들을위한 평가 명령을 사용할 수 있습니다, 당신은 또한 당신의 DB 이름을 추가 할 수 있습니다.

    기본 DB에 예비 작업에 노력하지 않으면 theTuxRacer에 의해 제안으로, 당신은 내가처럼 그것을 누락 사람들을위한 평가 명령을 사용할 수 있습니다, 당신은 또한 당신의 DB 이름을 추가 할 수 있습니다.

    mongo <dbname> --eval "printjson(db.something.find())"
    
  13. ==============================

    13.당신의 printf 감사합니다! 리눅스 환경에서, 여기에 하나의 파일이 쇼를 실행해야하는 더 좋은 방법입니다. 당신이 두 개의 파일, 여러 명령을 mongoCmds.js을 가지고 말 :

    당신의 printf 감사합니다! 리눅스 환경에서, 여기에 하나의 파일이 쇼를 실행해야하는 더 좋은 방법입니다. 당신이 두 개의 파일, 여러 명령을 mongoCmds.js을 가지고 말 :

    use someDb
    db.someColl.find()
    

    다음 드라이버 쉘 파일, runMongoCmds.sh

    mongo < mongoCmds.js
    

    대신, runMongoCmds.sh이 포함 된, 하나 개의 파일이

    printf "use someDb\ndb.someColl.find()" | mongo
    

    강타의 printf와 훨씬 더 강력한 에코보다와 수 있습니다 \ n 명령 사이에 여러 줄에 그들을 강제로.

  14. ==============================

    14.

    mongo <<EOF
    use <db_name>
    db.getCollection("<collection_name>").find({})
    EOF
    
  15. ==============================

    15.--shell 플래그는 자바 스크립트 파일도 사용할 수 있습니다

    --shell 플래그는 자바 스크립트 파일도 사용할 수 있습니다

     mongo --shell /path/to/jsfile/test.js 
    
  16. ==============================

    16.

    mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"
    
  17. ==============================

    17.내 경우에는, 내가 편리하게 사용할 수 있습니다 \ n 다음 몽고 명령에 대한 구분자로 나는 몽고에 다음 관에게이를 실행할

    내 경우에는, 내가 편리하게 사용할 수 있습니다 \ n 다음 몽고 명령에 대한 구분자로 나는 몽고에 다음 관에게이를 실행할

    echo $'use your_db\ndb.yourCollection.find()' | mongo
    
  18. ==============================

    18.한 줄에 그것을 처리하는 경우 쉬운 방법입니다.

    한 줄에 그것을 처리하는 경우 쉬운 방법입니다.

    file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)
    
    cat file.sh | mongo <EXPECTED_COLLECTION>
    
  19. ==============================

    19.최근 MongoDB의에서 포스트 그레스로 마이그레이션. 이것은 내가 스크립트를 사용하는 방법이다.

    최근 MongoDB의에서 포스트 그레스로 마이그레이션. 이것은 내가 스크립트를 사용하는 방법이다.

    mongo < scripts.js > inserts.sql
    

    inserts.sql에 scripts.js 및 출력 리디렉션을 읽어보십시오.

    이 같은 scripts.js의 모습

    use myDb;
    var string = "INSERT INTO table(a, b) VALUES";
    db.getCollection('collectionName').find({}).forEach(function (object) {
        string += "('" + String(object.description) + "','" + object.name + "'),";
    });
    print(string.substring(0, string.length - 1), ";");
    

    이 같은 inserts.sql 모습

    INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');
    
  20. ==============================

    20.나는 더 큰 배쉬 스크립트 내에서 몽고 쉘 스크립트를 실행하기위한 다양한 옵션을 썼다

    나는 더 큰 배쉬 스크립트 내에서 몽고 쉘 스크립트를 실행하기위한 다양한 옵션을 썼다

  21. ==============================

    21.몽고 인수 (--quiet, DBNAME 등)을 전달하는 능력을 가진 싱글 쉘 스크립트 솔루션 :

    몽고 인수 (--quiet, DBNAME 등)을 전달하는 능력을 가진 싱글 쉘 스크립트 솔루션 :

    #!/usr/bin/env -S mongo --quiet localhost:27017/test
    
    cur = db.myCollection.find({});
    while(cur.hasNext()) {
      printjson(cur.next());
    }
    

    -s 플래그는 모든 플랫폼에서 작동하지 않을 수 있습니다.

  22. ==============================

    22.replicaset를 사용하는 경우 나는 보통 호스트가 마스터 인 알아낼 필요 피할 수있는 다음과 같은 구문을 사용하므로, 쓰기는 PRIMARY에서 수행해야합니다 :

    replicaset를 사용하는 경우 나는 보통 호스트가 마스터 인 알아낼 필요 피할 수있는 다음과 같은 구문을 사용하므로, 쓰기는 PRIMARY에서 수행해야합니다 :

    몽고 -host myReplicaset / anyKnownReplica

  23. from https://stackoverflow.com/questions/4837673/how-to-execute-mongo-commands-through-shell-scripts by cc-by-sa and MIT license