शेल स्क्रिप्ट के माध्यम से मोंगो कमांड कैसे निष्पादित करें?


403

मैं mongoशेल स्क्रिप्ट में कमांड निष्पादित करना चाहता हूं , उदाहरण के लिए स्क्रिप्ट में test.sh:

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

जब मैं इस स्क्रिप्ट को निष्पादित करता हूं ./test.sh, तो MongoDB से कनेक्शन स्थापित होता है, लेकिन निम्नलिखित कमांड निष्पादित नहीं होते हैं।

शेल स्क्रिप्ट के माध्यम से अन्य कमांड कैसे निष्पादित करें 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())"
गिंगी

4
मुझे मोंगो <ip>: <port> / db --eval "Printjson (db.serverStatus ())" या mongo <ip>: <port> / db <aongoCommands.js जैसे कनेक्शन स्ट्रिंग को निर्दिष्ट करना था। हमेशा "परीक्षण" से जुड़े
dev

9
धन्यवाद @Gingi - मेरी पसंदीदा विधि है mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"... अनुकरण :)
मैट फ्लेचर

4
काश, मैं सभी परिणामों को प्राप्त करता, बजाय इसके कि इसे "अधिक 'टाइप करने के लिए" प्राइमेट "देखूं
रैंडी एल

6
@ अमिदा आप mongo --eval "db.version()" --quietउदाहरण के लिए ऐसा कर सकते हैं जिससे आप कहे जाने वाले सभी शोर को रोकने से बच सकें
Fermin Silva

327

एक .jsफाइल में अपनी आम स्क्रिप्ट रखो ।

फिर अमल करें mongo < yourFile.js

उदाहरण के लिए:

Demo.js // फ़ाइल में आपकी स्क्रिप्ट है

use sample  //db name
show collections

इस फ़ाइल को "c: \ db-script" में रखें

फिर cmd प्रॉम्प्ट में "c: \ db-script" पर जाएं

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
काफी शाब्दिक रूप से .. आप ठीक उसी कमांड को लेते हैं जिसे आप मूंग शेल में इनपुट करेंगे, उन कमांड्स को एक .jsफाइल में सेव करेंगे, और इसे mongoकमांड के पैरामीटर के रूप में पास करेंगे ।
मैट

7
यह कुछ भी ध्यान देने योग्य है कि आपने एक सामान्य विवरण (यदि आपूर्ति की गई है) को मोंगो दुभाषिया के दायरे में रखा है, जब आपकी स्क्रिप्ट (यदि आपूर्ति की जाती है) निष्पादित की जाती है। आप इसका उपयोग अपनी लिपियों को अधिक पुन: प्रयोज्य बनाने के लिए कर सकते हैं, जैसे। मोंगो - येवल "somevar = 'someval';" db_name Script_that_uses_somevar.js
एंड्रयू जे

9
@Matt - ध्यान दें कि गैर जावास्क्रिप्ट आदेशों खोल एक निष्पादित JavaScript फ़ाइल में उपलब्ध नहीं हैं प्रदान करता है, इसलिए use dbNameऔर show dbsखोल के आंतरिक शीघ्र नहीं बल्कि एक अंदर से से काम करेंगे .jsफ़ाइल। गैर-जावास्क्रिप्ट आदेशों के लिए जावास्क्रिप्ट समतुल्य हैं, इसलिए यह कोई सीमा नहीं है, बस कुछ के बारे में आपको जानकारी होनी चाहिए।
तद मार्शल

4
यदि आपको डेटाबेस, उपयोगकर्ता नाम, पासवर्ड का नाम निर्दिष्ट करने की आवश्यकता है, तो आप कर सकते हैंmongo dbName -u userName -p "password with spaces" scriptToRun.js
केविनएल

1
वहाँ एक तरीका है mongo शीघ्र खुला रखने के लिए? उर्फ मैं मूंगो को "अलविदा" नहीं कहना चाहता।
अलेक्जेंडर मिल्स


64

इसे एक फ़ाइल में रखें test.js:

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

इसके बाद इसे चलाएं mongo myDbName test.js


2
बैश से स्क्रिप्ट में वैल्यू कैसे पास करें? मैं नाम को db में सम्मिलित करना चाहता हूं जो चर के रूप में उपलब्ध है और मैं इसे स्क्रिप्ट (js) में
भेजना चाहता हूं

यह एक बेहतर समाधान है, जब मैं एक फाइल को mongo में पाइप करता हूं तो मुझे js सिंटैक्स त्रुटियां मिलती हैं।
स्टॉर्म मुलर


32

नीचे दी गई शेल स्क्रिप्ट ने भी मेरे लिए अच्छी तरह से काम किया ... निश्चित रूप से उस अप्रत्यक्ष का उपयोग करना था जिसका उल्लेख एंटोनिन ने पहले किया था ... जिसने मुझे यहां दस्तावेज़ का परीक्षण करने का विचार दिया।

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
डेनिस मुंकले

निश्चित रूप से उपयोगी है क्योंकि आप जेएस फ़ाइल के भीतर "mydb का उपयोग नहीं" कर सकते हैं।
buzypi

इसके लिए शुक्रिया! अंत में मैं कॉल करने में सक्षम हूं use another_db। :-)
Ionică Bizău

1
असल में आप DB को एक मोंगो लिपि के भीतर से स्विच कर सकते हैं:db = db.getSiblingDB('otherdb');
joeytwiddle

मुझे जिस चीज की जरूरत थी। हालाँकि, यदि आपको केवल एक डेटाबेस का उपयोग करने की आवश्यकता है, तो आप डेटाबेस का नाम mongo mydb <<EOF
मानगो


19

मैं "हेरेडोक" वाक्यविन्यास का उपयोग करता हूं, जिसे डेविड यंग उल्लेख करते हैं। लेकिन वहां एक जाल है:

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

मैं इसकी अनुशंसा नहीं करता, क्योंकि बच निकलना आसान है।

अन्य विकल्प ईओएफ से बचना है, जैसे:

#!/usr/bin/sh

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

अब, आप उन सभी डॉलर संकेतों को रख सकते हैं जो आप अपने हेरेडोक में चाहते हैं, और डॉलर के संकेतों को अनदेखा किया गया है। नीचे की ओर: यह काम नहीं करता है यदि आपको अपनी मानदंड लिपि में शेल पैरामीटर / चर डालने की आवश्यकता है।

एक और विकल्प जिसके साथ आप खेल सकते हैं वह है आपके शेबबैंग के साथ खिलवाड़ करना। उदाहरण के लिए,

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

इस समाधान के साथ कई समस्याएं हैं:

  1. यह केवल तभी काम करता है जब आप कमांड लाइन से एक मैंगो शेल स्क्रिप्ट को निष्पादन योग्य बनाने की कोशिश कर रहे हों। आप मैंगो शेल कमांड के साथ नियमित शेल कमांड नहीं मिला सकते हैं। और ऐसा करके आप जो कुछ भी बचाते हैं, वह कमांड लाइन पर "मोंगो" टाइप करने के लिए नहीं है ... (पर्याप्त रूप से, निश्चित रूप से)

  2. यह बिल्कुल "mongo <some-js-file>" जैसा कार्य करता है, जिसका अर्थ है कि यह आपको "उपयोग <db>" कमांड का उपयोग नहीं करने देता है।

मैंने डेटाबेस का नाम शेबंग में जोड़ने की कोशिश की है, जो आपको लगता है कि काम करेगा। दुर्भाग्य से, जिस तरह से सिस्टम शेबंग लाइन को प्रोसेस करता है, पहले स्पेस के बाद सब कुछ एक ही पैरामीटर (जैसे कि उद्धृत किया गया है) में एनवी कमांड को दिया जाता है, और एनवी इसे खोजने और चलाने में विफल रहता है।

इसके बजाय, आपको स्क्रिप्ट में ही डेटाबेस परिवर्तन को एम्बेड करना होगा, जैसे:

#!/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();

13

इस बारे में कैसा है:

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

1
या थोड़ा अधिक पठनीय: इको "db.mycollection.findOne ()" | मोंगो myDbName --quiet | python -m json.tool
dirkaholic

.mongorcलोड होने के बाद कुछ निष्पादित करने के लिए यह उपयोगी है ( docs.mongodb.org/manual/reference/program/mongo/… )
पी।

12

जैसा कि सुझाव दिया गया है theTuxRacer, आप eval कमांड का उपयोग कर सकते हैं , उन लोगों के लिए जो मुझे याद कर रहे थे जैसे कि आप अपने db नाम में भी जोड़ सकते हैं यदि आप डिफ़ॉल्ट db पर ऑपरेशन को प्रीफ़ॉर्म करने की कोशिश नहीं कर रहे हैं।

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

7

धन्यवाद printf! लिनक्स वातावरण में, यहां केवल एक फ़ाइल चलाने के लिए एक बेहतर तरीका है शो। कहो कि आपके पास दो फाइलें हैं, 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

- जावास्क्रिप्ट ध्वज का उपयोग जावास्क्रिप्ट फ़ाइलों के लिए भी किया जा सकता है

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

मुझे लगता है कि यह सिर्फ js निष्पादित होने के बाद खोल को छोड़ देता है? mongo /path/to/jsfile/test.jsjs को भी एक्सपेक्ट करेगा।
उपराष्ट्रपति


3

हाल ही में मोंगोडब से पोस्टग्रेज में प्रवास किया। इस तरह मैंने स्क्रिप्ट का इस्तेमाल किया।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.