मेरे लिए, mongoimport
के लिए अपने "CSV" को प्रारूपित करने का सबसे आसान तरीका बस एक संग्रह बनाना है तो mongoexport
. का उपयोग करें यह देखने के लिए कि सीएसवी प्रारूप कैसा दिखना चाहिए।
इसलिए शेल से अपना दस्तावेज़ बनाएं:
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
फिर शेल से बाहर निकलें और mongoexport
चलाएं :
mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
जो आपको आउटपुट दिखाएगा:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
जहां "सरणी" को "स्ट्रिंग" के साथ और उद्धरणों का उपयोग करके दर्शाया जाता है ""
उनके बच निकले रूप में।
यह अब mongoimport
. का उपयोग करने के लिए एक बहुत ही स्पष्ट स्थान है से, इसलिए परीक्षण के लिए अभी "आयात करें":
mongoimport -d test -c newcol --headerline --type csv out.csv
शेल को फिर से दर्ज करें और नए संग्रह में दस्तावेज़ देखें:
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
तो सब कुछ है, लेकिन बच्चों को एक सरणी के बजाय "स्ट्रिंग" के रूप में सूचीबद्ध किया गया है। लेकिन यह वास्तव में कोई समस्या नहीं है, क्योंकि हमने डेटा आयात किया है और अब यह हम पर निर्भर है कि हम इसे वास्तव में रूपांतरित करें:
var ops = [];
db.testcol.find({ "children": { "$type": 2} }).forEach(doc => {
var children = doc.children.split(',').map( e => e.replace(/"|\[|\]|\\/gm,'').toString() );
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "children": children } }
}
});
if ( ops.length >= 1000 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
});
if ( ops.length > 0 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
तो यह उस संग्रह में आयात की गई किसी भी चीज़ को पुनरावृत्त करने जा रहा है जिसमें बीएसओएन प्रकार 2 है जो $type
के माध्यम से "स्ट्रिंग" है क्वेरी ऑपरेटर।
फिर हम स्ट्रिंग लेते हैं, इसे एक सरणी के रूप में विभाजित करते हैं और अन्य वर्णों को केवल वही मान छोड़ते हैं जो आप चाहते हैं।
.bulkWrite()
. का उपयोग करना आप प्रति अनुरोध प्रत्येक दस्तावेज़ को लिखने के बजाय, उन अद्यतनों को एक कुशल तरीके से प्रतिबद्ध करते हैं। वे वास्तव में सर्वर पर 1000 के बैच में भेजे जाते हैं।
अंतिम परिणाम मूल वांछित रूप में दस्तावेज़ है:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
तो यह मेरा "कदम दर कदम" है कि आप अपने सीएसवी प्रारूप को कैसे काम कर सकते हैं, इसे आयात कर सकते हैं और फिर डेटा को उस स्थिति में "रूपांतरित" कर सकते हैं जिसकी आपको आवश्यकता है।