एक csv फ़ाइल के लिए mongo क्वेरी का पुनर्निर्देशित आउटपुट


85

मैं 32-बिट Windows7 मशीन के लिए MongoDB 2.2.2 का उपयोग कर रहा हूं। मेरे पास .js फ़ाइल में एक जटिल एकत्रीकरण क्वेरी है। मुझे शेल पर इस फ़ाइल को निष्पादित करने और सीएसवी फ़ाइल को आउटपुट निर्देशित करने की आवश्यकता है। मैं यह सुनिश्चित करता हूं कि क्वेरी एक "फ्लैट" json (कोई नेस्टेड कुंजियाँ) नहीं लौटाती है, इसलिए यह स्वाभाविक रूप से एक स्वच्छ सीएसवी में परिवर्तनीय है।

मैं के बारे में पता load()है और eval()eval()मुझे पूरी क्वेरी को शेल में पेस्ट करने की आवश्यकता है और केवल printjson()स्क्रिप्ट के अंदर अनुमति देता है , जबकि मुझे सीएसवी की आवश्यकता है। और, दूसरा तरीका: .. load()यह आउटपुट को स्क्रीन पर प्रिंट करता है, और फिर से json फॉर्मेट में।

वहाँ एक तरह से Mongo इस रूपांतरण को json से csv तक कर सकता है? (मुझे डेटा पर चार्ट तैयार करने के लिए सीएसवी फ़ाइल की आवश्यकता है)। मैं सोच रहा हूं:

1. या तो मोंगो के पास इसके लिए एक अंतर्निहित कमांड है जो मुझे अभी नहीं मिल सकती है।
2. मानगो मेरे लिए ऐसा नहीं कर सकता; मैं ज़्यादातर json आउटपुट को एक फ़ाइल में भेज सकता हूँ जिसे मुझे खुद csv में बदलने की आवश्यकता है।
3. मानगो जोंस आउटपुट को एक अस्थायी संग्रह में भेज सकता है, जिसकी सामग्री mongoexportedसीएसवी प्रारूप में आसानी से हो सकती है । लेकिन मुझे लगता है कि केवल मैप-कम क्वेरीज़ आउटपुट संग्रह का समर्थन करते हैं। क्या वह सही है? मुझे एक एकत्रीकरण क्वेरी के लिए इसकी आवश्यकता है।

किसी भी मदद के लिए धन्यवाद :)


1
यदि यह ऐसा कुछ है जो आप अक्सर करते हैं, तो आप .NET, पायथन का उपयोग करके एक स्टैंडअलोन EXE लिखने पर विचार कर सकते हैं, या आप NodeJs का उपयोग कर सकते हैं; प्रत्येक में एक देशी ड्राइवर होता है जो आपके कोड को निष्पादित करना और वांछित आउटपुट का उत्पादन करना आसान बनाता है।
वायर्डप्रैरी

मैं पर जाकारी के जवाब का जिक्र कर रहा हूँ stackoverflow.com/questions/4130849/... और json से सीएसवी कन्वर्ट करने के लिए कर रहा हूँ। लेकिन एक विकल्प के रूप में, क्या मैं एक संग्रह में जस्सन का उत्पादन कर सकता हूं और फिर एक mongoexport कर सकता हूं?
आफरीन शेख

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

जवाबों:


175

मुझे पता है कि यह सवाल पुराना है, लेकिन मैं एक घंटे को सीएसवी को एक जटिल क्वेरी निर्यात करने की कोशिश कर रहा हूं और मैं अपने विचारों को साझा करना चाहता था। पहले मैं jsv कन्वर्टर्स में से किसी को भी काम करने के लिए नहीं मिल सका (हालांकि यह एक आशाजनक लग रहा था)। मैंने जो कुछ किया, वह मैन्युअल रूप से मेरी मोंगो लिपि में सीएसवी फ़ाइल लिख रहा था।

यह एक सरल संस्करण है लेकिन अनिवार्य रूप से मैंने क्या किया है:

print("name,id,email");
db.User.find().forEach(function(user){
  print(user.name+","+user._id.valueOf()+","+user.email);
});

यह मैंने केवल क्वेरी को स्टडआउट करने के लिए पाइप किया था

mongo test export.js > out.csv

testमेरे द्वारा उपयोग किए जाने वाले डेटाबेस का नाम कहां है।


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

2
@NeluMalancea ने MongoDB डॉक्स देखें कि उनके पास यह जानकारी है। आप use <database>स्क्रिप्ट के शीर्ष पर जोड़कर DB को निर्दिष्ट कर सकते हैं
GE Novding

2
दरअसल, शेल हेल्पर्स जैसे कि "यूज़ <डेटाबेस>" जावास्क्रिप्ट नहीं हैं, उन्हें अनुमति नहीं है। डॉक्स . mongodb.org/manual/tutorial/… देखें । इसके बजाय, अपनी स्क्रिप्ट कुछ इस तरह से शुरू करें: कॉन = नया मोंगो (); db = con.getDB ('your_db_name');
स्टीव हेंसन स्मेथे

2
@NeluMalancea mongo कमांड एक db url (और उपयोगकर्ता, पास,…) स्वीकार करता है
iwein

3
@NeluMalancea testपिछले आदेश में है डेटाबेस का नाम, बस अपने डेटाबेस के नाम के साथ बदलें।
ज़ोल्टन

112

Mongo का इन-बिल्ट निर्यात ठीक काम कर रहा है, जब तक कि आप कोई डेटा हेरफेर नहीं करना चाहते हैं जैसे प्रारूप तिथि, गुप्त डेटा प्रकार आदि।

निम्नलिखित कमांड आकर्षण के रूप में काम करता है।

    mongoexport -h localhost -d databse -c collection --type=csv 
    --fields erpNum,orderId,time,status 
    -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
    --out report.csv

17
अनेक अनेक धन्यवाद! संकेत: अब इसके --type=csvबजाय है --csv
Jan

मोंगोएक्सपोर्ट की सीमा यह है कि आप खेतों में हेरफेर नहीं कर सकते। Mongo id, ObjectId (mongidstring) के रूप में निर्यात करता है। यदि कोई व्यक्ति खेतों के डेटा में हेरफेर करना चाहता है (उदाहरण के लिए ObjectId (mongidstring) .toString) ()।
राज006

क्या मैं एकत्रीकरण संचालन कर सकता हूं?
हेंडी इरावन

यह समाधान काम कर गया। लेकिन विंडोज के लिए मुझे दो संशोधन करने पड़े: मुझे बस बाहर से डबल एपोस्ट्रोफ की जरूरत थी और इस -q "{name: 'stackoverflow'}" जैसे सिंगल एपोस्ट्रोफिस में, पोर्ट निर्दिष्ट करने के लिए भी -p कमांड काम नहीं करता था, मैंने इस्तेमाल किया बंदरगाह 27000.
nurb

10

अन्य उत्तर देना:

मैंने @ GEverding के उत्तर को सबसे अधिक लचीला पाया। यह एकत्रीकरण के साथ भी काम करता है:

test_db.js

print("name,email");

db.users.aggregate([
    { $match: {} }
]).forEach(function(user) {
        print(user.name+","+user.email);
    }
});

परिणाम निर्यात करने के लिए निम्न आदेश निष्पादित करें:

mongo test_db < ./test_db.js >> ./test_db.csv

दुर्भाग्य से, यह CSV फ़ाइल में अतिरिक्त पाठ जोड़ता है जिसके लिए हमें इसका उपयोग करने से पहले फ़ाइल को संसाधित करना होगा:

MongoDB shell version: 3.2.10 
connecting to: test_db

लेकिन हम उन टिप्पणियों पर थूकना बंद कर सकते हैं और --quietझंडे को पास करने के लिए हमने जो भी मांगा है उसे छाप सकते हैं

mongo --quiet test_db < ./test_db.js >> ./test_db.csv

1
उसका उत्तर संपादित करना किसी नए को जोड़ने से बेहतर होगा।
रेनाटो बैक

6

यहाँ आप क्या कोशिश कर सकते हैं:

print("id,name,startDate")
cursor = db.<collection_name>.find();
while (cursor.hasNext()) {
    jsonObject = cursor.next();
    print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"")

}

उस फ़ाइल में सहेजें, "Export.js" कहें। निम्न आदेश चलाएँ:

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv

5

इस पर एक नजर

फाइल करने के लिए मैंगो शेल से आउटपुट के लिए। मूंगोस शेल से सीएसवी के आउटपुट के लिए कोई समर्थन नहीं है। आपको स्वयं जावास्क्रिप्ट लिखना होगा या उपलब्ध कई कन्वर्टर्स में से किसी एक का उपयोग करना होगा। उदाहरण के लिए Google "json को csv में बदलें"।


0

बस यहाँ एक अच्छा समाधान के साथ वजन में मैं का उपयोग किया गया है। यह ऊपर लकी सोनी के समाधान के समान है जिसमें यह एकत्रीकरण का समर्थन करता है, लेकिन फ़ील्ड नामों के हार्ड कोडिंग की आवश्यकता नहीं है।

cursor = db.<collection_name>.<my_query_with_aggregation>;

headerPrinted = false;
while (cursor.hasNext()) {
    item = cursor.next();
    
    if (!headerPrinted) {
        print(Object.keys(item).join(','));
        headerPrinted = true;
    }

    line = Object
        .keys(item)
        .map(function(prop) {
            return '"' + item[prop] + '"';
        })
        .join(',');
    print(line);
}

इसे एक .jsफ़ाइल के रूप में सहेजें , इस मामले में हम इसे कॉल करेंगे example.jsऔर इसे मोंगो कमांड लाइन के साथ चलाएंगे:

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