वहाँ एक फ़ाइल के लिए MongoDB खोल उत्पादन 'सुंदर' प्रिंट करने के लिए एक रास्ता है?


101

विशेष रूप से, मैं find()एक फ़ाइल में एक मोंगोडब के परिणाम प्रिंट करना चाहता हूं । JSON ऑब्जेक्ट बहुत बड़ा है इसलिए मैं शेल विंडो के आकार के साथ पूरी ऑब्जेक्ट को देखने में असमर्थ हूं।

जवाबों:


216

शेल कुछ अच्छा लेकिन छिपी हुई सुविधाएँ प्रदान करता है क्योंकि यह एक संवादात्मक वातावरण है।

जब आप mongo कमांड के माध्यम से एक जावास्क्रिप्ट फ़ाइल से कमांड चलाते हैं। तो आपको काफी समान व्यवहार नहीं मिलेगा।

इसके चारों ओर दो रास्ते हैं।

(1) शेल को नकली बनाना और यह सोचना कि आप इंटरैक्टिव मोड में हैं

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF

या
(2) find()एक मुद्रण योग्य JSON में परिणाम का अनुवाद करने के लिए जावास्क्रिप्ट का उपयोग करें

mongo dbname command.js > output.json

जहाँ command.js में यह (या इसके समतुल्य) शामिल हैं:

printjson( db.collection.find().toArray() )

यह सुंदर परिणाम के सरणी को प्रिंट करेगा, जिसमें [ ]- यदि आप नहीं चाहते हैं कि आप सरणी और printjson()प्रत्येक तत्व पर पुनरावृति कर सकते हैं ।

वैसे यदि आप केवल एक जावास्क्रिप्ट स्टेटमेंट चला रहे हैं तो आपको इसे किसी फाइल में नहीं रखना है और इसके बजाय आप इसका उपयोग कर सकते हैं:

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json

Command.js को एक पठनीय फ़ाइल होना चाहिए जो आपकी वर्तमान निर्देशिका में मौजूद है और जिसकी जावास्क्रिप्ट को आप चलाना चाहते हैं।
अस्य कामस्की

मैं इसे दूरस्थ मोंगो डीबी के लिए कैसे करूं? मैंने कोशिश की mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txtलेकिन यह मुझे दिया JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
शेहर

उस त्रुटि का मतलब है - येवैल के बाद आपके उद्धरण के अंदर क्या है, कानूनी वाक्यविन्यास नहीं है। मैं पूरे भावों के बाहर एकल उद्धरणों का उपयोग करने की सलाह देता हूं और अगर आपको इसके अंदर उद्धरणों की आवश्यकता है, तो उसके लिए दोहरे उद्धरण चिह्नों का उपयोग करें।
अस्य कामस्की

2
विकल्प 2 वास्तव में एकमात्र विकल्प है यदि आपके पास कुछ मुट्ठी भर से अधिक परिणाम हैं, तो विकल्प 1 के बाद से यह सिर्फ "टाइप" इसे "अधिक" के लिए रोक देगा।
टॉमी

2
वास्तव में नहीं @ उल्टी - शेल बैच का आकार शेल के अंदर एक चर के साथ चलाया जा सकता है। आप DBQuery.shellBatchSize = 10000 को अपनी .mongodbrc.js फ़ाइल में डाल सकते हैं और यह 20 के बजाय 10000 परिणामों के बाद "बंद हो जाएगा"
Asya Kamsky

29

जब से आप एक टर्मिनल पर यह कर रहे हैं और सिर्फ एक तरीके से एक रिकॉर्ड का निरीक्षण करना चाहते हैं, आप इस तरह से एक चाल का उपयोग कर सकते हैं:

mongo | tee somefile

सत्र को सामान्य के रूप में उपयोग करें - db.collection.find().pretty()या आपको जो भी करने की आवश्यकता है, लंबे आउटपुट को अनदेखा करें, और बाहर निकलें। आपके सत्र की एक प्रतिलिपि फ़ाइल में होगीtee लिखा जाएगा।

इस बात का ध्यान रखें कि आउटपुट में इंटरेक्टिव सेशन की अपेक्षा मेंगो शेल के कारण एस्केप सीक्वेंस और अन्य कचरा हो सकता है। lessइनायत संभालती है।


12

बस उन कमांड्स को डालें जिन्हें आप किसी फाइल में चलाना चाहते हैं, फिर इसे डेटाबेस के नाम के साथ शेल में पास करें और आउटपुट को फाइल में रीडायरेक्ट करें। इसलिए, यदि आपकी खोज कमांड में है find.jsऔर आपका डेटाबेस है foo, तो यह इस तरह दिखेगा:

./mongo foo find.js >> out.json

यह मेरे लिए काम नहीं किया, केवल खोल संस्करण और DB नाम मुद्रित करने के लिए out.jsonmongo foo < find.js > out.jsonकाम किया।
जेम्स ब्राउन

1
यह उत्तर उपकरण गो और कई संस्करणों में फिर से लिखे जाने से पहले लिखा गया था, जब तक कि आप कुछ बहुत पुराना उपयोग नहीं कर रहे हैं, तो शायद इसीलिए यह आपके लिए काम नहीं कर रहा है
एडम कॉमरफोर्ड

10

db.someCollection.find().pretty()एक जावास्क्रिप्ट फ़ाइल में अपनी क्वेरी (जैसे ) डालें , आइए बताते हैं query.js। फिर कमांड का उपयोग करके इसे अपने ऑपरेटिंग सिस्टम के शेल में चलाएं:

mongo yourDb < query.js > outputFile

क्वेरी परिणाम 'outputFile' नाम की फ़ाइल में होगा।

डिफ़ॉल्ट रूप से Mongo पहले 20 दस्तावेज़ IIRC प्रिंट करता है। यदि आप अधिक चाहते हैं तो आप मानगो शेल में बैच आकार में नए मान को परिभाषित कर सकते हैं, जैसे

DBQuery.shellBatchSize = 100


यह। .jsविस्तार से गलत मत बनो । आप उन सभी अच्छे मानगो शेल प्रश्नों को बिना बदले उन्हें लिख सकते हैं।
AD

4

का उपयोग कर printऔर JSON.stringifyआप बस एक वैध JSON परिणाम का उत्पादन कर सकते हैं । आउटपुट से शेल शोर को फ़िल्टर करने के लिए ध्वज का
उपयोग करें --quiet
मूल्यांकन --norcसे बचने के लिए ध्वज का उपयोग करें .mongorc.js। (मुझे इसका उपयोग एक सुंदर-फॉर्मेटर के कारण करना पड़ा जो मैं उपयोग करता हूं, जो अमान्य JSON आउटपुट का उत्पादन करता है) पेजिंग से बचने के लिए वास्तविक परिणाम की सीमा के साथ DBQuery.shellBatchSize = ?प्रतिस्थापित करें ?

और अंत में, teeटर्मिनल आउटपुट को फ़ाइल में पाइप करने के लिए उपयोग करें:

// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json

// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
  print(JSON.stringify(data, null, 2));
}

toPrint(
  db.getCollection('myCollection').find().toArray()
);

उम्मीद है की यह मदद करेगा!


2

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

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

फिर कोई इसे चला सकता है:

exportToJson.bat DbName CollectionName


2

मैं writeFile () फ़ंक्शन के साथ परिणाम सहेजने में कामयाब रहा ।

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

मैंगो शेल संस्करण 4.0.9 था


1

इसके अलावा मोंगोएक्सपोर्ट है है, लेकिन मुझे यकीन नहीं है कि यह किस संस्करण में उपलब्ध है।

उदाहरण:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json

0

Neodan mongoexport द्वारा उत्तर के रूप में -qक्वेरी के लिए विकल्प के साथ काफी उपयोगी है । यह ObjectIdJSON के मानक प्रारूप में भी परिवर्तित होता है "$oid"। उदाहरण के लिए:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

0

आप इसे हासिल करने के लिए इस कमांड का उपयोग कर सकते हैं:

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

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