মঙ্গো ক্যোয়ারীর আউটপুটকে একটি সিএসভি ফাইলে পুনঃনির্দেশ করুন


88

আমি 32-বিট উইন্ডোজ 7 মেশিনের জন্য মঙ্গোডিবি ২.২.২ ব্যবহার করছি। আমার কাছে .js ফাইলে একটি জটিল সমষ্টি প্রশ্ন রয়েছে। আমার এই ফাইলটি শেলটিতে চালিত করতে হবে এবং আউটপুটটিকে একটি CSV ফাইলে ডাইরেক্ট করতে হবে। আমি নিশ্চিত করেছি যে ক্যোয়ারী একটি "ফ্ল্যাট" জাসনকে (কোনও নেস্টেড কীগুলি নেই) ফেরায়, তাই এটি সহজাতভাবে একটি ঝরঝরে সিএসভিতে রূপান্তরযোগ্য।

আমি load()এবং সম্পর্কে জানি eval()eval()আমার পুরো ক্যোয়ারিকে শেলটিতে পেস্ট করার প্রয়োজন এবং কেবল printjson()স্ক্রিপ্টের মধ্যে অনুমতি দেয় , যখন আমার সিএসভি প্রয়োজন। এবং, দ্বিতীয় উপায়: load().. এটি স্ক্রিনে আউটপুট এবং আবার জসন ফর্ম্যাটে মুদ্রণ করে।

মোঙ্গো এই জাতীয় রূপান্তরকে জসন থেকে সিএসভিতে করতে পারে এমন কোন উপায় আছে কি? (ডেটাতে চার্ট প্রস্তুত করার জন্য আমার সিএসভি ফাইল দরকার)। আমি ভাবছি:

১। মঙ্গোর একটি বিল্ট-ইন কমান্ড রয়েছে যা আমি এখনই খুঁজে পাচ্ছি না।
২. মঙ্গো আমার পক্ষে এটি করতে পারে না; আমি সর্বাধিক কোনও ফাইলকে জসন আউটপুট প্রেরণ করতে পারি যা আমার নিজের থেকে পরে সিএসভিতে রূপান্তর করতে হবে।
৩. মোঙ্গো একটি অস্থায়ী সংগ্রহের জন্য জসন আউটপুট প্রেরণ করতে পারে, এর লিখিত সামগ্রীগুলি mongoexportedসিএসভি ফর্ম্যাটে সহজেই পাওয়া যায় । তবে আমি মনে করি কেবল মানচিত্র-হ্রাস অনুসন্ধানগুলি আউটপুট সংগ্রহকে সমর্থন করে। এটা কি সঠিক? একত্রিতকরণ ক্যোয়ারির জন্য আমার এটি দরকার।

কোন সাহায্যের জন্য ধন্যবাদ :)


4
আপনি যদি ঘন ঘন এটি করেন তবে আপনি নেট। পাইথন বা নোডজে ব্যবহার করে স্ট্যান্ড স্টোন এক্স লিখতে বিবেচনা করতে পারেন; প্রত্যেকের একটি নেটিভ ড্রাইভার রয়েছে যা আপনার কোডটি কার্যকর করতে এবং আকাঙ্ক্ষিত আউটপুট উত্পাদন করা সহজ করে তুলবে।
ওয়্যার্ডপ্রাইরি

আমি স্ট্যাকওভারফ্লো / প্রশ্ন / 4130849/… তে জাচারির জবাবটি উল্লেখ করছি এবং জসন থেকে সিএসভিতে রূপান্তর করতে সক্ষম। তবে বিকল্প হিসাবে, আমি কোনও সংকলনে জাসনকে আউটপুট দিতে পারি এবং তারপরে একটি মঙ্গোএক্সপোর্ট করতে পারি?
আফরিন শেখ

আমি আপনাকে নোডজেএস এবং নোডজেএস-এর জন্য মঙ্গোডিবি ড্রাইভার ব্যবহার করে কেবল একটি ছোট জোতা তৈরি করার পরামর্শ দিচ্ছি এবং তারপরে আপনি যে কোডটি চান তা কার্যকর করতে পারেন। শেলটির বিনা প্রয়োজনে আপনি খুব দ্রুত ফলাফলগুলি পেতে চান। এটি খুব রক্ষণাবেক্ষণযোগ্য (এবং ডিবাজিযোগ্য) হবে।
ওয়্যার্ডপ্রাইরি

উত্তর:


179

আমি জানি এই প্রশ্নটি পুরানো তবে আমি সিএসভিতে একটি জটিল প্রশ্ন রফতানি করার চেষ্টা করে এক ঘন্টা ব্যয় করেছি এবং আমি আমার মতামতগুলি ভাগ করে নিতে চাই। প্রথমে আমি সিএসভি রূপান্তরকারীদের কাছে কাজ করার জন্য জসনগুলির কোনওটিই পাইনি (যদিও এটি দেখতে আশাব্যঞ্জক মনে হয়েছিল)। আমি যা করতে পেরেছি তা হ'ল আমার মোঙ্গো স্ক্রিপ্টে ম্যানুয়ালি সিএসভি ফাইলটি লেখা ছিল।

এটি একটি সাধারণ সংস্করণ তবে মূলত আমি যা করেছি:

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ডাটাবেসের আমি ব্যবহারের নাম।


ব্যবহারকারীর সংগ্রহটি কী আছে তা আমি কীভাবে নির্দিষ্ট করব?
নেলু

4
@ নেলুম্যালেন্সা তাদের কাছে এই তথ্যটি রয়েছে মঙ্গোডিবি ডক্স পরীক্ষা করে দেখুন । আপনি use <database>স্ক্রিপ্টের শীর্ষে
GEverding

4
প্রকৃতপক্ষে, যেহেতু শেল সহায়কগুলি যেমন "ব্যবহার << ডাটাবেস>" জাভাস্ক্রিপ্ট নয়, তাদের অনুমতি নেই। ডকস.মঙ্গোদবি.আর . / ম্যানুয়াল / টিউটোরিয়াল/ … দেখুন । পরিবর্তে, আপনার স্ক্রিপ্টটি এরকম কিছু শুরু করুন: সং = নতুন মঙ্গো (); db = conn.getDB ('আপনার_ডিবি_নাম');
স্টিভ হ্যানসেন স্মিথ

4
@NeluMalancea মোঙ্গো কমান্ড একটি ডিবি URL গ্রহণ (এবং ব্যবহারকারী, পাস, ...)
iwein

4
@NeluMalancea testগত কমান্ডে হয় ডেটাবেসের নাম, শুধু আপনার ডেটাবেসের নাম সঙ্গে এটি প্রতিস্থাপন।
জোল্টন

116

মোঙ্গোর অন্তর্নির্মিত রফতানি ঠিকঠাক কাজ করছে, যদি না আপনি বিন্যাসের তারিখ, গোপনীয় ডেটা প্রকার ইত্যাদির মতো কোনও ডেটা ম্যানিপুলেশন না চান unless

নিম্নলিখিত কমান্ড কবজ হিসাবে কাজ করে।

    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
জানুয়ারী

মঙ্গোএক্সপোর্টের সীমাবদ্ধতা হ'ল আপনি ক্ষেত্রগুলি পরিচালনা করতে পারবেন না। মোঙ্গো আইডিটি অবজেক্টআইডি (মঙ্গিস্ট্রিং) হিসাবে রফতানি করে। কেউ যদি ক্ষেত্রগুলির ডেটা (উদাহরণস্বরূপ অবজেক্টআইডি (মঙ্গিস্ট্রিং)। টোস্ট্রিং ()) ব্যবহার করতে চান তবে মঙ্গো শেল স্ক্রিপ্ট থেকে ফলাফল রফতানি করতে সক্ষম হওয়াই ভাল।
রাজ006

4
আমি কি একীকরণ অপারেশন করতে পারি?
হেন্ডি ইরাওয়ান

এই সমাধান কাজ করে। তবে উইন্ডোজের জন্য আমাকে দুটি সংশোধন করতে হয়েছিল: আমার কেবল বাইরে থেকে ডাবল অ্যাডাস্ট্রোফের প্রয়োজন হয়েছিল এবং এই -Q "{নাম: 'স্ট্যাকওভারফ্লো'}" এর মতো অভ্যন্তরে একক অ্যাড্রোস্ফের দরকার ছিল, পোর্ট নির্দিষ্টকরণের জন্য -p কমান্ড কাজ করে না, আমি ব্যবহার করেছি - -port 27000.
nurb

10

অন্যান্য উত্তরগুলি প্রসারিত করা:

আমি @ জিভার্ডিংয়ের উত্তরটি সবচেয়ে নমনীয় পেয়েছি। এটি একত্রিতকরণের সাথেও কাজ করে:

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

দুর্ভাগ্যক্রমে, এটি সিএসভি ফাইলে অতিরিক্ত পাঠ্য যুক্ত করে যার জন্য ফাইলটি ব্যবহারের আগে প্রক্রিয়াজাতকরণ করা দরকার:

MongoDB shell version: 3.2.10 
connecting to: test_db

কিন্তু আমরা যারা মন্তব্য আউট মোঙ্গো শেল স্টপ থুথু করতে পারেন এবং শুধুমাত্র প্রিন্ট কিসের জন্য বলা হয়েছে ক্ষণস্থায়ী দ্বারা --quietপতাকা

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

4
তার উত্তর সম্পাদনা করা একটি নতুন উত্তর যুক্ত করার চেয়ে ভাল।
রেনাতো ব্যাক

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

এই একবার দেখুন

মঙ্গো শেল থেকে ফাইল আউটপুট দেওয়ার জন্য। মঙ্গোস শেল থেকে সিএসভি আউটপুট দেওয়ার জন্য কোনও সমর্থন নেই। আপনাকে নিজেই জাভাস্ক্রিপ্ট লিখতে হবে বা উপলব্ধ প্রচুর রূপান্তরকারীগুলির মধ্যে একটি ব্যবহার করতে হবে। গুগল উদাহরণস্বরূপ "জসনকে সিএসভিতে রূপান্তরিত করে"।


1

আমি এখানে ব্যবহার করে আসছি এমন একটি দুর্দান্ত সমাধান সহ কেবল ভারে। এটি লাকী সোনির উপরের সমাধানের অনুরূপ যে এটি একত্রিতকরণকে সমর্থন করে তবে ক্ষেত্রের নামগুলির হার্ড কোডিংয়ের প্রয়োজন নেই।

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

0

আমি নিম্নলিখিত কৌশলটি ব্যবহার করি। কলামের নামগুলি সামগ্রীর সাথে সিঙ্ক করে রাখা সহজ করে তোলে:

var cursor = db.getCollection('Employees.Details').find({})

var header = []
var rows = []

var firstRow = true
cursor.forEach((doc) => 
{
    var cells = []
    
    if (firstRow) header.push("employee_number")
    cells.push(doc.EmpNum.valueOf())

    if (firstRow) header.push("name")
    cells.push(doc.FullName.valueOf())    

    if (firstRow) header.push("dob")
    cells.push(doc.DateOfBirth.valueOf())   
    
    row = cells.join(',')
    rows.push(row)    

    firstRow =  false
})

print(header.join(','))
print(rows.join('\n'))

0

রিমোট সার্ভারে কোনও স্ক্রিপ্ট কার্যকর করার সময়। মঙ্গো তার নিজস্ব লগিং আউটপুট যুক্ত করবে, যা আমরা আমাদের ফাইল থেকে বাদ দিতে চাই। --quietবিকল্পটি কেবল সংযোগ সম্পর্কিত লগগুলি অক্ষম করবে। সমস্ত মঙ্গো লগ হয় না। এই ক্ষেত্রে আমাদের অযৌক্তিক লাইনগুলিকে ম্যানুয়ালি ফিল্টার করতে হবে। একটি উইন্ডোজ ভিত্তিক উদাহরণ:

mongo dbname --username userName --password password --host replicaset/ip:port --quiet printDataToCsv.js | findstr /v "NETWORK" > data.csv

এটি স্ক্রিপ্ট আউটপুটটি পাইপ করবে এবং findstrকোনও লাইন ফিল্টার করতে ব্যবহার করবে , যার মধ্যে নেটওয়ার্ক স্ট্রিং রয়েছে। ফাইন্ডস্টারে আরও তথ্য: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr

এর একটি লিনাক্স সংস্করণ ব্যবহার করবে grep

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