답변:
--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 :
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
... simples :)
mongo --eval "db.version()" --quiet
예를 들어 당신이 말하는 모든 소음을 인쇄하지 않도록 할 수 있습니다
몽고 스크립트를 .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>
.js
파일에 저장 한 다음 명령에 매개 변수로 전달합니다 mongo
.
use dbName
와 show dbs
쉘의 내부 프롬프트 아니지만 내부에서에서 작동합니다 .js
파일. 비 JavaScript 명령에 해당하는 JavaScript가 있으므로 이는 제한 사항이 아니라 알아야 할 사항입니다.
mongo dbName -u userName -p "password with spaces" scriptToRun.js
이것은 Linux에서 저에게 효과적입니다.
mongo < script.js
이것을 다음이라는 파일에 넣으십시오 test.js
.
db.mycollection.findOne()
db.getCollectionNames().forEach(function(collection) {
print(collection);
});
그런 다음로 실행하십시오 mongo myDbName test.js
.
이것에 대한 공식 문서 페이지도 있습니다.
해당 페이지의 예는 다음과 같습니다.
mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"
아래의 쉘 스크립트는 저에게도 훌륭하게 작동했습니다 ... Antonin이 처음 언급 한 리디렉션을 사용해야했습니다 ... 여기서 여기 문서를 테스트 할 아이디어가있었습니다.
function testMongoScript {
mongo <<EOF
use mydb
db.leads.findOne()
db.leads.find().count()
EOF
}
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
있습니다. :-)
db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
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>
이 솔루션에는 몇 가지 문제가 있습니다.
명령 행에서 mongo 쉘 스크립트를 실행 가능하게하려는 경우에만 작동합니다. 일반 쉘 명령을 mongo 쉘 명령과 혼합 할 수 없습니다. 명령 행에 "mongo"를 입력하지 않아도됩니다 (물론 충분한 이유).
"mongo <some-js-file>"과 정확히 동일하게 작동하므로 "use <db>"명령을 사용할 수 없습니다.
나는 데이터베이스 이름을 shebang에 추가하려고 시도했다. 불행히도, 시스템이 shebang 라인을 처리하는 방식으로, 첫 번째 공백 이후의 모든 것이 단일 매개 변수 (인용 된 것처럼)로 env 명령에 전달되고 env는이를 찾아 실행하지 못합니다.
대신 다음과 같이 스크립트 자체에 데이터베이스 변경 사항을 포함시켜야합니다.
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
인생의 어떤 것과 마찬가지로, "한 가지 이상의 방법이 있습니다!"
이건 어때요:
echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName
.mongorc
로드 된 후 무언가를 실행하는 데 유용합니다 ( docs.mongodb.org/manual/reference/program/mongo/… )
감사합니다 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
명령 사이에 여러 줄에 그들을 강제로.
--shell 플래그는 자바 스크립트 파일에도 사용할 수 있습니다
mongo --shell /path/to/jsfile/test.js
mongo /path/to/jsfile/test.js
js도 예상합니다.
최근 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');
How to execute mongo commands through shell scripts?
이것은 주제가 아닙니다. 사실, 제목 때문에이 질문에 도달했습니다. 그래서 저 같은 사람들은 그러한 대답을 읽는 것이 좋습니다. 또한 장난감 예제가 아닌 예제에서 매우 유용한 방법을 제공합니다.
.find()
작업, 당신은 같은 문서를 인쇄 할 결과 개체에 대한 작업을 호출 할 필요가toArray()
또는shellPrint()
. 예 :mongo userdb --eval "printjson(db.users.find().toArray())"