শেল স্ক্রিপ্টগুলির মাধ্যমে মঙ্গো কমান্ডগুলি কীভাবে কার্যকর করা যায়?


403

আমি mongoশেল স্ক্রিপ্টে কমান্ডগুলি কার্যকর করতে চাই , যেমন কোনও স্ক্রিপ্টে test.sh:

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

আমি যখন এই স্ক্রিপ্টটি মাধ্যমে ./test.shসম্পাদন করি , তখন মঙ্গোডিবিতে সংযোগ স্থাপন করা হয় তবে নিম্নলিখিত কমান্ডগুলি কার্যকর হয় না।

শেল স্ক্রিপ্টের মাধ্যমে অন্যান্য কমান্ড কীভাবে কার্যকর করা যায় test.sh?

উত্তর:


452

আপনি --evalযদি পতাকাটি ব্যবহার করে কোনও কমান্ডকে মূল্যায়ন করতে পারেন তবে এটি কেবলমাত্র একটি কমান্ড।

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

দয়া করে নোট করুন: আপনি যদি একটি $ চিহ্ন দিয়ে শুরু করে মঙ্গো অপারেটর ব্যবহার করছেন, আপনি পরিবেশের পরিবর্তনশীল হিসাবে অপারেটরের মূল্যায়ন থেকে শেলটি রক্ষা করতে আপনি একক উদ্ধৃতিতে স্পষ্ট যুক্তিটি ঘিরে রাখতে চাইবেন:

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 ())" বা মঙ্গো <ip>: <port> / ডিবি <মঙ্গোকম্যান্ডস.জেএস এর মতো সংযোগের স্ট্রিংটি আমাকে নির্দিষ্ট করতে হয়েছিল from সর্বদা "পরীক্ষার" সাথে সংযুক্ত হচ্ছে
দেব

9
ধন্যবাদ জিঙ্গি - আমার পছন্দের পদ্ধতিটি হ'ল mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"... সরল :)
ম্যাট ফ্লেচার

4
আমি আশা করি আমি ফলাফলগুলি সমস্ত কিছু না পেয়ে তার পরিবর্তে "আরও লিখুন 'এটি টাইপ করুন
রেন্ডি এল

6
@ আমিদা mongo --eval "db.version()" --quietউদাহরণস্বরূপ আপনি যে সমস্ত শব্দটি বলেছিলেন তা মুদ্রণ এড়ানোর জন্য করতে পারেন
ফারমিন সিলভা

327

আপনার মঙ্গো স্ক্রিপ্টটি একটি .jsফাইলে রাখুন ।

তারপরে মৃত্যুদণ্ড কার্যকর করুন mongo < yourFile.js

উদা:

demo.js // ফাইলটিতে আপনার স্ক্রিপ্ট রয়েছে

use sample  //db name
show collections

এই ফাইলটিকে "সি: b ডিবি-স্ক্রিপ্টস" এ রাখুন

তারপরে সেন্টিমিডি প্রম্পটে "সি: b ডিবি-স্ক্রিপ্টস" এ যান

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
আপনার স্ক্রিপ্টটি (সরবরাহ করা হলে) কার্যকর করা হলে মঙ্গো দোভাষীকে আপনি - দ্বিতীয় বয়সের (সরবরাহ করা থাকলে) বিবৃতিতে সেট করা কিছু লক্ষ্য করার সুযোগ রয়েছে। আপনি এটি ব্যবহার করতে পারেন আপনার স্ক্রিপ্টগুলি আরও পুনরায় ব্যবহারযোগ্য, যেমন। মঙ্গো --eval "somevar = 'কিছু কিছু';" ডিবি_নাম স্ক্রিপ্ট_ত_স_সোমবার.জেএস
অ্যান্ড্রু জে

9
@ ম্যাট - নোট করুন যে জাভাস্ক্রিপ্ট নন যে শেলটি সরবরাহ করে তা কার্যকর করা জাভাস্ক্রিপ্ট ফাইলে পাওয়া যায় না, use dbNameএবং show dbsএটি শেলের অভ্যন্তরীণ প্রম্পট থেকে কাজ করবে তবে কোনও .jsফাইলের অভ্যন্তরে নয় । নন-জাভাস্ক্রিপ্ট কমান্ডগুলির জন্য জাভাস্ক্রিপ্ট সমতুল্য রয়েছে, সুতরাং এটি কোনও সীমাবদ্ধতা নয়, আপনার কিছু সচেতন হওয়া দরকার।
ট্যাড মার্শাল

4
আপনার যদি কোনও ডাটাবেসের নাম, ব্যবহারকারীর নাম, পাসওয়ার্ড উল্লেখ করতে হয় তবে আপনি করতে পারেনmongo dbName -u userName -p "password with spaces" scriptToRun.js
কেভিনল

1
মঙ্গো প্রম্পট খোলা রাখার কোন উপায় আছে কি? একে, আমি চাই না মঙ্গো আমাকে "বাই" বলুক।
আলেকজান্ডার মিলস


64

এটি নামক একটি ফাইলে রাখুন test.js:

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

তারপরে এটি চালান mongo myDbName test.js


2
বাশ থেকে স্ক্রিপ্টে মানগুলি কীভাবে পাস করবেন? আমি ডিবিতে নাম সন্নিবেশ করতে চাই যা
ব্যাশগুলিতে

এটি একটি আরও ভাল সমাধান, যখন আমি মঙ্গোতে একটি ফাইল পাইপ করি তখন আমি জেএস সিন্ট্যাক্স ত্রুটি পাই।
ঝড় মুলার


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
ডেনিস মঙ্কলে

অবশ্যই কার্যকর কারণ আপনি কোনও জেএস ফাইলের মধ্যে "মাইডিবি ব্যবহার করুন" ব্যবহার করতে পারবেন না।
বুজিপি

এই জন্য আপনাকে ধন্যবাদ! অবশেষে আমি কল করতে সক্ষম use another_db। :-)
আয়নিক বিজাউ

1
আসলে আপনি একটি মঙ্গো স্ক্রিপ্টের মধ্যে থেকে ডিবি স্যুইচ করতে পারেন:db = db.getSiblingDB('otherdb');
জোয়েটউইডল

ঠিক যেটা আমার দরকার ছিল. তবে যদি আপনার কেবল একটি ডাটাবেস ব্যবহারের প্রয়োজন হয় তবে আপনি ডাটাবেসের নামটি মঙ্গো কমান্ড, যেমন, mongo mydb <<EOFইত্যাদিতে পাস করতে পারেন
spikyjt


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. এটি ঠিক "মঙ্গো <some-js-file>" এর মতো কাজ করে যার অর্থ এটি আপনাকে "<d>" ব্যবহার করতে দেয় না।

আমি শেবাংয়ে ডাটাবেসের নাম যুক্ত করার চেষ্টা করেছি, যা আপনি ভাবেন যে কাজ করবে। দুর্ভাগ্যক্রমে, সিস্টেম যেভাবে শেবাং লাইনটি প্রক্রিয়াকরণ করে, প্রথম স্থানের পরে সমস্ত কিছু একক প্যারামিটার হিসাবে এনভাইড কমান্ডে (যেমন উদ্ধৃত হয়) পাস করার পরে এনভিভি এটি খুঁজে পেতে এবং চালাতে ব্যর্থ হয়।

পরিবর্তে, আপনাকে স্ক্রিপ্টের মধ্যেই ডাটাবেস পরিবর্তন এম্বেড করতে হবে, যেমন:

#!/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 ()" | mongo myDbName --quiet | পাইথন-মি json.tool
dirkaholic

.mongorcলোড হওয়ার পরে কোনও কিছু কার্যকর করতে এটি দরকারী ( ডকস.মঙ্গডবি.আর / ম্যানুয়াল / রেফারেন্স / প্রোগ্রাম / মঙ্গো/… )
জিয়ানফ্র্যাঙ্কো পি

12

যেমনটি প্রস্তাবিত হয়েছিল theTuxRacer, আপনি ইভাল কমান্ডটি ব্যবহার করতে পারেন , যারা আমার মতো এটি মিস করছেন তাদের জন্য, আপনি যদি ডিফল্ট ডিবিতে অপারেশন প্রম্পট করার চেষ্টা না করেন তবে আপনি আপনার ডিবি নামটিও যুক্ত করতে পারেন।

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

7

ধন্যবাদ printf! লিনাক্স পরিবেশে, কেবলমাত্র একটি ফাইল শো চালানোর জন্য এখানে আরও ভাল উপায়। বলুন আপনার mongoCmds.jsএকাধিক কমান্ড সহ দুটি ফাইল রয়েছে :

use someDb
db.someColl.find()

এবং তারপরে ড্রাইভার শেল ফাইল, runMongoCmds.sh

mongo < mongoCmds.js

পরিবর্তে, কেবলমাত্র একটি ফাইল থাকুন, রানমঙ্গোসিএমডিএস.এস রয়েছে

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 

আমি মনে করি এটি ঠিক কার্যকর হলে জেএস কার্যকর হবে? mongo /path/to/jsfile/test.jsজেএসও বহিষ্কার করা হবে।
ক্রিক


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?এটি অফ-টপিক নয়। আসলে, আমি শিরোনামের কারণে এই প্রশ্নে পৌঁছেছি। সুতরাং আমার মতো লোকেরা এই জাতীয় উত্তর পড়তে উপকৃত হয়। এছাড়াও, আমি খেলনার উদাহরণের চেয়ে উদাহরণে খুব দরকারী পদ্ধতি দিচ্ছি।
পৌরাণিক কোডার 15

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

একটি প্রতিলিপি ব্যবহার করার সময়, লেখাগুলি অবশ্যই প্রাইমারিতে করা উচিত, তাই আমি সাধারণত এটির মতো সিনট্যাক্স ব্যবহার করি যা কোন হোস্টটি মাস্টার তা নির্ধারণ করা এড়ানো যায়:

mongo -host myReplicaset/anyKnownReplica

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.