쉘 스크립트를 통해 mongo 명령을 실행하는 방법은 무엇입니까?


403

mongo쉘 스크립트, 예를 들어 스크립트에서 명령 을 실행하고 싶습니다 test.sh.

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

를 통해이 스크립트를 실행하면 ./test.shMongoDB에 대한 연결이 설정되지만 다음 명령은 실행되지 않습니다.

쉘 스크립트를 통해 다른 명령을 실행하는 방법은 test.sh무엇입니까?

답변:


452

--eval단일 명령 인 경우 플래그를 사용하여 명령을 평가할 수도 있습니다 .

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

참고 : $ 부호로 시작하는 Mongo 연산자를 사용하는 경우 쉘이 연산자를 환경 변수로 평가하지 못하도록 eval 인수를 작은 따옴표로 묶어야합니다.

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 :

35
들어 .find()작업, 당신은 같은 문서를 인쇄 할 결과 개체에 대한 작업을 호출 할 필요가 toArray()또는 shellPrint(). 예 :mongo userdb --eval "printjson(db.users.find().toArray())"
Gingi

4
mongo <ip> : <port> / db --eval "printjson (db.serverStatus ())"또는 mongo <ip> : <port> / db <mongoCommands.js와 같은 연결 문자열을 지정해야합니다. 항상 "test"에 연결
dev

9
고맙습니다 @ Gingi-내가 선호하는 방법은 mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"... simples :)
Matt Fletcher

4
내가 대신은 " '그'이상 유형"밖으로 primt 보는, 모든 결과를 얻을 텐데
랜디 L

6
@ Amida 당신은 mongo --eval "db.version()" --quiet예를 들어 당신이 말하는 모든 소음을 인쇄하지 않도록 할 수 있습니다
Fermin Silva

327

몽고 스크립트를 .js파일에 넣으십시오 .

그런 다음 실행 mongo < yourFile.js

전의:

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

use sample  //db name
show collections

이 파일을 "c : \ db-scripts"에 보관하십시오

그런 다음 cmd 프롬프트에서 "c : \ db-scripts"로 이동하십시오.

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>

13
문자 그대로 .. mongo 셸에 입력 한 것과 동일한 명령을 사용하여 해당 명령을 .js파일에 저장 한 다음 명령에 매개 변수로 전달합니다 mongo.
Matt

7
--eval 문 (제공된 경우)에 설정 한 내용은 스크립트 (제공된 경우)가 실행될 때 mongo 인터프리터에 범위가 유지됩니다. 이를 통해 스크립트를 더 재사용 할 수 있습니다 (예 : mongo --eval "somevar = 'someval';" db_name script_that_uses_somevar.js
Andrew J

9
@ 매트 - 비 자바 스크립트 쉘이 실행 된 자바 스크립트 파일에서 사용할 수 없습니다 제공하는 명령, 그래서주의 use dbNameshow dbs쉘의 내부 프롬프트 아니지만 내부에서에서 작동합니다 .js파일. 비 JavaScript 명령에 해당하는 JavaScript가 있으므로 이는 제한 사항이 아니라 알아야 할 사항입니다.
Tad Marshall

4
데이터베이스 이름, 사용자 이름, 비밀번호를 지정해야 할 경우 다음을 수행 할 수 있습니다.mongo dbName -u userName -p "password with spaces" scriptToRun.js
KevinL

1
몽고 프롬프트를 열어 두는 방법이 있습니까? 일명 나는 몽고가 나에게 "안녕"이라고 말하고 싶지 않습니다.
Alexander Mills


64

이것을 다음이라는 파일에 넣으십시오 test.js.

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

그런 다음로 실행하십시오 mongo myDbName test.js.


2
bash에서 스크립트로 값을 전달하는 방법은 무엇입니까? bash에서 변수로 사용할 수있는 이름을 db에 삽입하고 script (js)에 전달하고 싶습니다
Sasikanth

이것은 파일을 mongo로 파이프 할 때 js 구문 오류가 발생하는 훨씬 더 나은 솔루션입니다.
Storm Muller

41

이것에 대한 공식 문서 페이지도 있습니다.

해당 페이지의 예는 다음과 같습니다.

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

32

아래의 쉘 스크립트는 저에게도 훌륭하게 작동했습니다 ... Antonin이 처음 언급 한 리디렉션을 사용해야했습니다 ... 여기서 여기 문서를 테스트 할 아이디어가있었습니다.

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

13
좋은 답변입니다! 여러 명령의 경우에도 작동합니다.echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
Dennis Münkle

JS 파일 내에서 "use mydb"를 사용할 수 없기 때문에 확실히 유용합니다.
buzypi

감사합니다! 마지막으로 전화를 걸 수 use another_db있습니다. :-)
Ionică Bizău

1
실제로 몽고 스크립트 내에서 DB를 전환 할 수 있습니다.db = db.getSiblingDB('otherdb');
joeytwiddle

내가 필요한 것만 그러나 하나의 데이터베이스 만 사용해야하는 경우 데이터베이스 이름을 mongo mydb <<EOF
mongo

22

내 설정에서는 다음을 사용해야합니다.

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

20

David Young이 언급 한 "heredoc"구문을 사용합니다. 그러나 캐치가 있습니다.

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { $exists: true }
})
.forEach( printjson );
EOF

"$ exists"라는 문구가 쉘에 표시되고 이름이 "exists"인 환경 변수의 값으로 대체되기 때문에 위의 내용은 작동하지 않습니다. 존재하지 않는 쉘 확장 후에는 다음과 같이됩니다.

#!/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

이제이 문서에 원하는 모든 달러 기호를 넣을 수 있으며 달러 기호는 무시됩니다. 단점 : mongo 스크립트에 쉘 매개 변수 / 변수를 넣어야하는 경우 작동하지 않습니다.

당신이 놀 수있는 또 다른 옵션은 shebang을 엉망으로 만드는 것입니다. 예를 들어

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

이 솔루션에는 몇 가지 문제가 있습니다.

  1. 명령 행에서 mongo 쉘 스크립트를 실행 가능하게하려는 경우에만 작동합니다. 일반 쉘 명령을 mongo 쉘 명령과 혼합 할 수 없습니다. 명령 행에 "mongo"를 입력하지 않아도됩니다 (물론 충분한 이유).

  2. "mongo <some-js-file>"과 정확히 동일하게 작동하므로 "use <db>"명령을 사용할 수 없습니다.

나는 데이터베이스 이름을 shebang에 추가하려고 시도했다. 불행히도, 시스템이 shebang 라인을 처리하는 방식으로, 첫 번째 공백 이후의 모든 것이 단일 매개 변수 (인용 된 것처럼)로 env 명령에 전달되고 env는이를 찾아 실행하지 못합니다.

대신 다음과 같이 스크립트 자체에 데이터베이스 변경 사항을 포함시켜야합니다.

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

인생의 어떤 것과 마찬가지로, "한 가지 이상의 방법이 있습니다!"


18

인증이 활성화 된 경우 :

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

16

스크립트 파일을 작성하십시오. 쓰기 명령 :

#!/bin/sh
mongo < file.js

file.js쓰기 당신의 몽고 쿼리 :

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


12

에서 제안한 것처럼 eval 명령을 theTuxRacer사용할 수 있습니다. 실제로 누락 된 사람들을 위해 기본 db에서 작업을 수행하지 않으려는 경우 db 이름을 추가 할 수도 있습니다.

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

7

감사합니다 printf! Linux 환경에서는 하나의 파일 만 쇼를 실행하는 더 좋은 방법이 있습니다. mongoCmds.js여러 명령으로 두 개의 파일이 있다고 가정 해보십시오 .

use someDb
db.someColl.find()

드라이버 셸 파일 runMongoCmds.sh

mongo < mongoCmds.js

대신 runMongoCmds.sh 파일이 하나만 있어야합니다.

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

강타의는 printf훨씬 더 강력한보다 echo하고 허용 \n명령 사이에 여러 줄에 그들을 강제로.



6

내 경우에는 \n실행하려는 다음 몽고 명령의 분리 기호로 편리하게 사용할 수 있습니다.mongo

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

4

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

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

나는 이것이 js가 실행 된 후에 쉘을 열어 둔다고 생각합니까? mongo /path/to/jsfile/test.jsjs도 예상합니다.
UpTheCreek

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

3

최근 mongodb에서 Postgres로 마이그레이션했습니다. 이것이 내가 스크립트를 사용한 방법입니다.

mongo < scripts.js > inserts.sql

scripts.js및 출력 리디렉션을 읽습니다 inserts.sql.

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');

1
원래 질문과 관련하여 매우 흥미롭지 만 주제가 아닙니다.
jlyonsmith

How to execute mongo commands through shell scripts?이것은 주제가 아닙니다. 사실, 제목 때문에이 질문에 도달했습니다. 그래서 저 같은 사람들은 그러한 대답을 읽는 것이 좋습니다. 또한 장난감 예제가 아닌 예제에서 매우 유용한 방법을 제공합니다.
신화

2

한 줄로 처리하려면 쉬운 방법입니다.

file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)

cat file.sh | mongo <EXPECTED_COLLECTION>

1

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


1

몽고 인수 ( --quiet, dbname 등) 를 전달할 수있는 단일 쉘 스크립트 솔루션 :

#!/usr/bin/env -S mongo --quiet localhost:27017/test

cur = db.myCollection.find({});
while(cur.hasNext()) {
  printjson(cur.next());
}

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


0

복제 세트를 사용할 때 PRIMARY에서 쓰기를 수행해야하므로 일반적으로 마스터와 같은 호스트를 알아낼 필요가없는 다음과 같은 구문을 사용합니다.

mongo -host myReplicaset/anyKnownReplica

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.