programing

셸 스크립트를 사용하여 mongo 명령을 실행하는 방법은 무엇입니까?

showcode 2023. 4. 5. 22:31
반응형

셸 스크립트를 사용하여 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에 ..jsfilename을 클릭합니다.

실행해보세요.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>

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

  1. 이 기능은 명령줄에서 mongo 셸 스크립트를 실행 가능하게 하려고 할 경우에만 작동합니다.일반 셸 명령어와 mongo 셸 명령을 함께 사용할 수 없습니다.이렇게 하면 명령줄에 "mongo"를 입력할 필요가 없어집니다.(물론 충분한 이유)

  2. 이 명령어는 "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.jsmongo 쿼리를 작성합니다.

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

.printfLinux 환경에서는 하나의 파일만 쇼를 실행하는 더 좋은 방법이 있습니다.의 파일이 가정해보세요.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

반응형