MongoDB में CSV को संग्रह कैसे निर्यात करें?


98

आप एक .csvफ़ाइल में MongoDB संग्रह में सभी रिकॉर्ड कैसे निर्यात करते हैं ?

mongoexport --host localhost --db dbname --collection name --type=csv > test.csv

यह मुझे उन क्षेत्रों का नाम निर्दिष्ट करने के लिए कहता है जिन्हें मुझे निर्यात करने की आवश्यकता है। क्या मैं खेतों के नाम निर्दिष्ट किए बिना सभी क्षेत्रों को निर्यात कर सकता हूं?

जवाबों:


113

@ karoly-horvath के पास यह अधिकार है। सीएसवी के लिए फ़ील्ड आवश्यक हैं।

MongoDB इश्यू ट्रैकर में इस बग के अनुसार https://jira.mongodb.org/browse/SERVER-4224 आप एक सीएसवी को निर्यात करते समय खेतों को प्रदान करते हैं । डॉक्स इस पर स्पष्ट नहीं हैं। यही त्रुटि का कारण है।

इसे इस्तेमाल करे:

mongoexport --host localhost --db dbname --collection name --csv --out text.csv --fields firstName,middleName,lastName

अपडेट करें:

यह प्रतिबद्ध है: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 डॉक्स को 3.0.0-rc10 और बाद में ठीक करता है। यह बदलता है

Fields string `long:"fields" short:"f" description:"comma separated list of field names, e.g. -f name,age"`

सेवा

Fields string `long:"fields" short:"f" description:"comma separated list of field names (required for exporting CSV) e.g. -f \"name,age\" "`

संस्करण 3.0 और संक्षिप्त:

--type=csvइसके बजाय आपको उपयोग करना चाहिए --csvक्योंकि इसे हटा दिया गया है।

अधिक जानकारी: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

पूर्ण आदेश:

mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName

16
संस्करण के रूप में 3.0.6 का mongoexportकहना हैcsv flag is deprecated; please use --type=csv instead
रोमन Dibikhin

संस्करण 3.0 और संक्षिप्त संपादित करने के लिए धन्यवाद (अनाम)।
कैंपसटरन

4
क्या प्रत्येक नामकरण के बजाय सभी क्षेत्रों को शामिल करने का एक तेज़ तरीका है?
केवज

53

इसके अलावा, आपको अल्पविराम से अलग किए गए फ़ील्ड नामों के बीच रिक्त स्थान की अनुमति नहीं है।

खराब: -f firstname, lastname

अच्छा: -f firstname,lastname


27
mongoexport  --help
....
-f [ --fields ] arg     comma separated list of field names e.g. -f name,age
--fieldFile arg         file with fields names - 1 per line

आपको इसे मैन्युअल रूप से निर्दिष्ट करना होगा और यदि आप इसके बारे में सोचते हैं, तो यह सही समझ में आता है। MongoDB स्कीमालेस है; दूसरी ओर, CSV में कॉलम के लिए एक निश्चित लेआउट है। विभिन्न दस्तावेजों में किन क्षेत्रों का उपयोग किया जाता है, यह जाने बिना कि सीएसवी डंप का उत्पादन करना असंभव है।

यदि आपके पास एक निश्चित स्कीमा है, तो शायद आप एक दस्तावेज़ को पुनः प्राप्त कर सकते हैं, एक स्क्रिप्ट के साथ उसमें से फ़ील्ड नाम काट सकते हैं और इसे mongxexport को पास कर सकते हैं।


1
मैं बस खोज रहा था कि क्या मैं एक रिकॉर्ड से खेतों की सूची प्राप्त कर सकता हूं। db.collection.finOne ()। getFields () से। लेकिन मुझे लगता है कि यह सही तरीका नहीं है (getFields)। मैं getKeys () के रूप में अच्छी तरह से करने की कोशिश की। अन्यथा मुझे कुंजी: मूल्य हैश के साथ रिकॉर्ड प्राप्त करना होगा।
सक्सेस स्टाॅल

मैं एक ही काम करने की कोशिश कर रहा हूं, लेकिन यह पता लगाने के लिए कि यह सीएसवी फाइलों को ठीक से आयात क्यों नहीं करता है। मेरे मामले में, मुझे यह अपने बारे में सब कुछ बताने की जरूरत है कि इसमें कौन से क्षेत्र शामिल हैं। इसलिए मेरे मामले में खेतों को निर्दिष्ट करने के लिए सही अर्थ नहीं है, क्योंकि मुझे नहीं पता कि वे सभी क्या हैं!
स्टीफन

फील्ड हार्वेस्टिंग स्क्रिप्ट के मोर्चे पर, मैंने इसे एक या एक साल बाद पोस्ट किया , हो सकता है कि आप कुछ विचार दें।
अरोबर 11

9

यदि आप चाहें, तो आप सभी संग्रह को निर्दिष्ट किए बिना सीएसवी को निर्यात कर सकते हैं --fields(सभी क्षेत्रों का निर्यात करेंगे)।

से http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ इस bash स्क्रिप्ट चलाने

OIFS=$IFS;
IFS=",";

# fill in your details here
dbname=DBNAME
user=USERNAME
pass=PASSWORD
host=HOSTNAME:PORT

# first get all collections in the database
collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
collectionArray=($collections);

# for each collection
for ((i=0; i<${#collectionArray[@]}; ++i));
do
    echo 'exporting collection' ${collectionArray[$i]}
    # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
    keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
    # now use mongoexport with the set of keys to export the collection to csv
    mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
done

IFS=$OIFS;

4
उपरोक्त स्क्रिप्ट के साथ केवल एक मुद्दा यह है कि यह प्रत्येक संग्रह में पहले दस्तावेज़ को मानता है जिसमें सभी संभावित कुंजियाँ हैं जो उस संग्रह में एक दस्तावेज़ में दिखाई दे सकती हैं; यदि दस्तावेज़ प्रकार में कोई सरणी या नेस्टेड उप दस्तावेज़ हो सकता है, तो ऐसा नहीं हो सकता है।
arober11

@ arober11 आप सही हैं, इस महत्वपूर्ण तथ्य का उल्लेख करना भूल गए। मैं आमतौर पर क्या करता हूं, सभी कुंजियों को समय-समय पर एकत्रित करने के लिए स्क्रिप्ट को कम करने के लिए एक नक्शा चलाया जाता है और सभी कुंजियों को खींचने के लिए इसका उपयोग किया जाता है
माइकल

3

मुझे मेरे लिए ऐसा करने के लिए मोंगोएक्सपोर्ट नहीं मिल सका। मैंने पाया कि, सभी क्षेत्रों की एक विस्तृत सूची प्राप्त करने के लिए, आपको एक बार पूरे संग्रह के माध्यम से लूप करना होगा। हेडर बनाने के लिए इसका उपयोग करें। फिर संग्रह के माध्यम से लूप फिर से प्रत्येक दस्तावेज़ के लिए इन हेडर को पॉप्युलेट करें।

मैंने ऐसा करने के लिए एक स्क्रिप्ट लिखी है। अलग-अलग दस्तावेजों के बीच स्कीमा अंतर के बावजूद MongoDB डॉक्स को सीएसवी में परिवर्तित करना।

https://github.com/surya-shodan/mongoexportcsv


2

इसके अलावा, अगर आप आंतरिक json क्षेत्रों को निर्यात करना चाहते हैं, तो dot (ऑपरेटर) का उपयोग करें।

JSON रिकॉर्ड:

{
    "_id" : "00118685076F2C77",
    "value" : {
        "userIds" : [ 
            "u1"
        ],
        "deviceId" : "dev"
}

mongoexport डॉट ऑपरेटर के साथ कमांड (mongo संस्करण 3.4.7 का उपयोग करके):

./mongoexport --host लोकलहोस्ट --db myDB --collection myColl --type = csv --out out.csv --fields value.deviceId, value.userIds

आउटपुट सीएसवी:

value.deviceId,value.userIds
d1,"[""u1""]"
d2,"[""u2""]"

नोट: सुनिश्चित करें कि आप किसी सरणी को निर्यात नहीं करते हैं। यह ऊपर दिखाए गए फ़ील्ड userIds की तरह CSV प्रारूप को दूषित करेगा


0

MongoDB एटलस उपयोगकर्ताओं के लिए समाधान!

--fieldsदो उलटे उद्धरणों में संलग्न अल्पविराम से अलग क्षेत्र के नाम के रूप में पैरामीटर जोड़ें :

--fields "<FIELD 1>,<FIELD 2>..."

यह पूरा उदाहरण है:

mongoexport --host Cluster0-shard-0/shard1URL.mongodb.net:27017,shard2URL.mongodb.net:27017,shard3URL.mongodb.net:27017 --ssl --username <USERNAME> --password <PASSWORD> --authenticationDatabase admin --db <DB NAME> --collection <COLLECTION NAME> --type <OUTPUT FILE TYPE> --out <OUTPUT FILE NAME> --fields "<FIELD 1>,<FIELD 2>..."

-1

मेरे लिए यह काम यह कोशिश करो

mongoexport --host cluster0-shard-dummy-link.mongodb.net:27017 --db yourdbname --forceTableScan   --collection users --type json --out /var/www/html/user.json --authenticationDatabase admin --ssl --username Yourusername --password Yourpassword

उपर्युक्त cmd उपयोगकर्ताओं के संपूर्ण डेटा को वापस करता है यदि आप फ़िल्टर फ़ील्ड चाहते हैं तो --fields = email, name जोड़ें


यह नीचे दिए गए उत्तरों से कैसे भिन्न है?
डैनियल डब्ल्यू।

mongodump --host क्लस्टर0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / दस्तावेज / db-12-2020 --authenticationDatn admin --ssl --username youruname - पासवर्ड अपने क्रॉसवर्ड आप यह भी कोशिश कर सकते हैं यह आपको पूरे संग्रह देता है।
मनोज पटेल

-1

मेरे लिए एक डोंगा कंटेनर के साथ रीमोटिंग के लिए काम करता है: 4.2.6

mongoexport -h mongodb:27017 --authenticationDatabase=admin -u username -p password -d database -c collection -q {"created_date": { "$gte": { "$date": "2020-08-03T00:00:00.000Z" }, "$lt": { "$date": "2020-08-09T23:59:59.999Z" } } } --fields=somefield1,somefield2 --type=csv --out=/archive.csv

-2

नीचे CSV प्रारूप में संग्रह निर्यात करने के लिए कमांड का उपयोग किया जाता है।

नोट: naagडेटाबेस है, employee1_jsonएक संग्रह है।

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1

यह वही है जो मोंगोडब 4 रिटर्न: असफल: सीएसवी मोड में एक फ़ील्ड सूची की आवश्यकता होती है
FRIDDAY

-2

उन सभी के लिए जो एक त्रुटि के साथ फंस गए हैं।

मुझे आप लोगों को उसी की संक्षिप्त व्याख्या के साथ एक समाधान दें: -

कनेक्ट करने के लिए कमांड: -

mongoexport --host your_host --port your_port -u your_username -p your_password --db your_db --collection your_collection --type=csv --out file_name.csv --fields all_the_fields --authenticationDatabase admin

--होस्ट -> मैंगो सर्वर का मेजबान

--पोर्ट -> मोंगो सर्वर का पोर्ट

-उ -> उपयोगकर्ता नाम

-p -> पासवर्ड

--db -> db जिससे आप निर्यात करना चाहते हैं

--collection -> संग्रह जिसे आप निर्यात करना चाहते हैं

- टाइप -> मेरे मामले में निर्यात का प्रकार CSV

--out -> फ़ाइल नाम जहाँ आप निर्यात करना चाहते हैं

--fields -> वे सभी फ़ील्ड जिन्हें आप निर्यात करना चाहते हैं (CSV के मामले में अल्पविराम के बीच दो फ़ील्ड नाम के बीच रिक्त स्थान न दें)

--authenticationDatabase -> डेटाबेस जहां आपकी सभी उपयोगकर्ता जानकारी संग्रहीत है

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