셸 스크립트를 사용하여 mongo 명령을 실행하는 방법은 무엇입니까?
는 행 i i i i i i i i를 실행하고 싶다mongo
스크립트의 , 에서의 명령어(예: " )test.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
에서 이 할 때./test.sh
그러면 MongoDB로의 접속이 확립되지만 다음 명령어는 실행되지 않습니다.
스크립트를 test.sh
하려면 명령어를 해야 합니다.--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에 ..js
filename을 클릭합니다.
실행해보세요.mongo < yourFile.js
예:
demo.demo //file에 스크립트가 있습니다.
use sample //db name
show collections
이 파일을 "c:\db-module"에 보관합니다.
그런 다음 cmd 프롬프트에서 "c:\db-scripts"로 이동합니다.
C:\db-scripts>mongo < demo.js
그러면 코드가 mongo에서 실행되고 출력이 표시됩니다.
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>
Linux에서는 다음과 같이 동작합니다.
mongo < script.js
새로운 버전의 mongodb의 경우
mongosh < 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())"
아래 셸 스크립트도 잘 작동했는데...안토닌이 처음에 말한 리다이렉트를 사용해야만 했어요이 문서를 테스트해 볼 수 있는 아이디어를 얻었어요.
function testMongoScript {
mongo <<EOF
use mydb
db.leads.findOne()
db.leads.find().count()
EOF
}
인증이 유효하게 되어 있는 경우:
mongo -u username -p password --authenticationDatabase auth_db_name < your_script.js
새로운 버전의 경우
mongosh -u username -p password --authenticationDatabase auth_db_name < your_script.js
저는 데이비드 영이 언급한 "edoc" 구문을 사용합니다.하지만 한가지 단점이 있습니다.
#!/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 스크립트에 셸 파라미터/변수를 넣어야 하는 경우에는 동작하지 않습니다.
네가 가지고 놀 수 있는 또 다른 옵션은 너의 셰방을 엉망으로 만드는 것이다.예를들면,
#!/bin/env mongo
<some mongo stuff>
이 솔루션에는 몇 가지 문제가 있습니다.
이 기능은 명령줄에서 mongo 셸 스크립트를 실행 가능하게 하려고 할 경우에만 작동합니다.일반 셸 명령어와 mongo 셸 명령을 함께 사용할 수 없습니다.이렇게 하면 명령줄에 "mongo"를 입력할 필요가 없어집니다.(물론 충분한 이유)
이 명령어는 "mongo <some-js-file>"과 동일하게 기능합니다.즉, "use <db>" 명령어는 사용할 수 없습니다.
셰방에 데이터베이스 이름을 추가해 봤는데, 잘 될 것 같아요.아쉽게도 시스템이 셰방 회선을 처리하는 방법에서는 첫 번째 공백 이후의 모든 것이 단일 파라미터(따옴표로 묶은 것처럼)로 env 명령어에 전달되며 env는 검색 및 실행에 실패합니다.
대신 다음과 같이 데이터베이스 변경을 스크립트 자체에 포함시켜야 합니다.
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
인생의 모든 것과 마찬가지로, "그것을 하는 방법은 한 가지가 아니다!"
셋업에서는 다음을 사용해야 합니다.
mongo --host="the.server.ip:port" databaseName theScript.js
새로운 버전의 mongodb의 경우
mongosh --host="the.server.ip:port" databaseName theScript.js
이거 어때:
echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName
스크립트 파일을 만듭니다.명령어를 씁니다.
#!/bin/sh
mongo < file.js
새로운 버전의 경우 mongosh < file . js
»file.js
mongo 쿼리를 작성합니다.
db.collection.find({"myValue":null}).count();
★★★의 theTuxRacer
나처럼 eval 명령어를 사용할 수 없습니다.디폴트 db에 대한 조작을 사전에 작성하려고 하지 않으면 db 이름을 추가할 수도 있습니다.
mongo <dbname> --eval "printjson(db.something.find())"
mongodb의 새로운 버전
mongosh <dbname> --eval "printjson(db.something.find())"
쓸 수 요.\n
을 mongo에 .mongo
echo $'use your_db\ndb.yourCollection.find()' | mongo
mongodb의 새로운 버전
echo $'use your_db\ndb.yourCollection.find()' | mongosh
.printf
Linux 환경에서는 하나의 파일만 쇼를 실행하는 더 좋은 방법이 있습니다.의 파일이 가정해보세요.mongoCmds.js
여러 명령어를 사용합니다.
use someDb
db.someColl.find()
후 셸 파일 " " " " " "runMongoCmds.sh
mongo < mongoCmds.js
mongodb의 새로운 버전
mongosh < mongoCmds.js
대신, runMongoCmds.sh이라는 파일 하나만 가져와서
printf "use someDb\ndb.someColl.find()" | mongo
쉬의printf
튼튼하다echo
해서 할 수 있어요.\n
령령 、 에령줄줄줄 between between령령령 。
mongo <<EOF
use <db_name>
db.getCollection("<collection_name>").find({})
EOF
--shell 플래그는 javascript 파일에도 사용할 수 있습니다.
mongo --shell /path/to/jsfile/test.js
mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"
최근에 몽고브에서 포스트그레스로 이주했어요저는 이렇게 대본을 썼어요.
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');
한 줄로 처리하고 싶다면 쉬운 방법입니다.
file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)
cat file.sh | mongo <EXPECTED_COLLECTION>
할 수 있는 셸(mongo는 mongo를 사용합니다).--quiet
, dbname 등):
#!/usr/bin/env -S mongo --quiet localhost:27017/test
cur = db.myCollection.find({});
while(cur.hasNext()) {
printjson(cur.next());
}
그-S
플래그가 일부 플랫폼에서는 작동하지 않을 수 있습니다.
레플리카 세트를 사용하는 경우는, PRIMAY 로 기입할 필요가 있기 때문에, 통상, 다음과 같은 구문을 사용하고 있기 때문에, 어느 호스트가 마스터인지 확인할 필요가 없습니다.
mongo -host myReplicaset/anyKnownReplica
기존 Mongo 쉘은 2022년 버전 6 출시와 함께 MongoDB에서 제거되었습니다.
새로운 셸 mongosh를 사용하여 셸 스크립트를 실행하는 새로운 방법이 있습니다.
스크립트 작성에 관한 셸 매뉴얼에서 다음 절차를 수행합니다.
- mongosh를 사용하여 mongosh 콘솔에 들어가지 않고 명령줄에서 스크립트를 실행할 수 있습니다.
- 파일명을 지정하려면 --file 또는 -f 파라미터를 사용하여 파일명을 지정합니다.
- 연결 정보를 지정해야 할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/4837673/how-to-execute-mongo-commands-through-shell-scripts
'programing' 카테고리의 다른 글
React Native는 iOS 및 Android에서 JavaScript를 네이티브로 실행할 수 있도록 하기 위해 무엇을 사용합니까? (0) | 2023.04.05 |
---|---|
왜 모든 렌더에서 useEffect의 정리 기능이 호출됩니까? (0) | 2023.04.05 |
useState() 훅을 사용하여 리액트 상태를 갱신하려면 어떻게 해야 합니까? (0) | 2023.04.05 |
'상세정보' 유형에 속성이 없습니다.HTMLDivElement' (HTMLDivElement) (Resact 16 탑재) (0) | 2023.04.05 |
WordPress "on-the-fly"에서 언어를 전환하는 방법 (0) | 2023.04.05 |