মংগোডিবিতে কীভাবে একটি ডাটাবেস থেকে অন্য ডাটাবেসে কোনও সংগ্রহ অনুলিপি করবেন


221

এটি করার কোন সহজ পথ আছে কি?


40
গৃহীত উত্তরটি বিতর্কিতভাবে 2012 সালে সেরা পদ্ধতি ছিল, তবে এখন db.clone Colલેક્શન () প্রায়শই একটি ভাল সমাধান। এখানে আরও কয়েকটি সাম্প্রতিক উত্তর রয়েছে যা এটি উল্লেখ করে, তাই আপনি যদি গুগল থেকে এখানে এসেছিলেন (যেমন আমি করেছি) সমস্ত উত্তর একবার দেখুন!
কেলভিন

4
কেবলমাত্র @ ক্যালভিনের নিজের অবস্থাতেই নয়, এটি আপনার প্রয়োজনের সাথে খাপ খায় কিনা তা নিশ্চিত করার জন্য অন্যান্য উত্তরগুলিও পড়তে ভুলবেন না
পিডব্লিউ কাদ

উত্তর:


206

এই মুহূর্তে মঙ্গোডিবিতে কোনও আদেশ নেই যা এটি করবে। সম্পর্কিত বৈশিষ্ট্যের অনুরোধের সাথে দয়া করে JIRA টিকিটটি নোট করুন ।

আপনি যেমন কিছু করতে পারেন:

db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });

দয়া করে মনে রাখবেন যে এটির সাথে, দুটি ডাটাবেসটির কাজ করার জন্য একই মঙ্গোদ ভাগ করা প্রয়োজন।

এগুলি ছাড়াও, আপনি একটি ডাটাবেস থেকে সংগ্রহের একটি মংডাম্প্প করতে পারেন এবং তারপরে সংগ্রহটি অন্য ডাটাবেসে সংগ্রহ করতে পারেন।


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

1
একমত। শেলটি নিয়ে বেড়ানোর জন্য এটি ছিল মজাদার পরামর্শ। অধিকন্তু, এটি সূচীগুলির উপরে আনবে না। আমি যদি এটি করছিলাম তবে আমি প্রতিবার মংডাম্প / মংগোরস্টোর করব।
জেসন ম্যাককে

2
ধন্যবাদ। দয়া করে নোট করুন যে কোডটিতে আপনার টাইপ রয়েছে, getSiblingDB ফাংশনটি বন্ধ করে দিচ্ছেন না। এখানে সংশোধিত কোডটি রয়েছে: ডিবি। <কালেকশন_নাম> ফাইন্ড () .আর জন্য (ফাংশন (d) {db.getSiblingDB ('<নতুন> ডেটাবেস>') ['<collection_name>']। সন্নিবেশ (ডি);});
ফ্লাভিউ

1
এটি পরীক্ষার রানগুলির মধ্যে স্বর্ণের অনুলিপি থেকে একটি পরীক্ষা মঙ্গোদব পুনরায় সেট করার জন্য ভাল কাজ করেছে। সংগ্রহের নামগুলি হার্ড কোডিংয়ের পরিবর্তে আপনি যে সমস্ত সংগ্রহের নাম অনুলিপি করতে চান তার উপর লুপের জন্য আপনি db.get Colલેક્શન (নাম) .ফাইন্ড () দিয়ে করতে পারেন forএইচ জন্য এবং db.getSiblingDB ("otherdb") রয়েছে এমন একটি ফাংশন সরবরাহ করুন। getCollection (নাম) .insert (ঘ)।
simbo1905

2
বিশাল আকারের সংগ্রহের জন্য এটি কি দক্ষ?
খলিল আওদা

284

সবচেয়ে ভাল উপায়টি হল মংডোম্প্প করা তারপর মংগেরস্টোর।

আপনি এর মাধ্যমে সংগ্রহটি নির্বাচন করতে পারেন:

mongodump -d some_database -c some_collection

[Allyচ্ছিকভাবে, ডাম্পটি জিপ করুন ( zip some_database.zip some_database/* -r) এবং scpএটি অন্য কোথাও]

তারপরে এটি পুনরুদ্ধার করুন:

mongorestore -d some_other_db -c some_or_other_collection dump/some_collection.bson

বিদ্যমান ডেটা some_or_other_collectionসংরক্ষণ করা হবে। এইভাবে আপনি একটি ডাটাবেস থেকে অন্য ডাটাবেসে কোনও সংগ্রহ "সংযুক্ত" করতে পারেন।

সংস্করণ ২.৪.৩ এর পূর্বে, আপনার নিজের ডেটা অনুলিপি করার পরে আপনাকে আপনার সূচিগুলিও যুক্ত করতে হবে। 2.4.3 দিয়ে শুরু করে, এই প্রক্রিয়াটি স্বয়ংক্রিয় এবং আপনি এটি দিয়ে অক্ষম করতে পারেন --noIndexRestore


মনে হয় মোংডাম্প কাজ করে না যদি আপনার পাসওয়ার্ড সুরক্ষিত মঙ্গো উদাহরণ থাকে (এবং আপনার উচিত!)
কামিলো

3
এটি পিডব্লিউ সুরক্ষিত ডিবিতে কাজ করে আপনার কেবলমাত্র প্যারামগুলিতে লেখক পাস করতে হবে
বেন

2
এটি সন্ধান / forEach / সন্নিবেশ তুলনায় খুব দ্রুত, আমার ক্ষেত্রে 2 মিনিট বনাম 2 ঘন্টা
Juraj Paulo

পাসওয়ার্ডের জন্য একটি প্রম্পট পেতে - পাসওয়ার্ড নয় - ব্যবহারকারীর সাথে ডাটাবেসের জন্য ব্যবহারকারীর নাম পাস করুন। আপনার কমান্ড লাইন পাসওয়ার্ড লাগাতে না এটা সবচেয়ে ভাল হয় (.bash_history বা অনুরূপ সেটিকে সংরক্ষণ শেষ পর্যন্ত)
Chanoch

অপ্রাপ্তবয়স্ক: আমি কিছু_ডাটাবেস দ্বারা নামক সাবফোল্ডারে ফাইলটি পেয়েছি সুতরাং এটি আমার জন্য কাজ করে: মংগেরস্টোর -d কিছু_ডর_ডিব-সি কিছু_আর_থর_কোলিকেশন ডাম্প / কিছু_ডাটাবেস / কিছু_কলেশন.বসন
অ্যাভিকো

88

আসলে, সেখানে হয় একটি কমান্ড সরানো এক ডাটাবেসের থেকে অন্য একটা সংকলন। এটিকে কেবল "সরানো" বা "অনুলিপি" বলা হয় না।

কোনও সংগ্রহ অনুলিপি করতে, আপনি এটি একই ডিবিতে ক্লোন করতে পারেন, তারপরে ক্লোনটি সরান।

ক্লোন করতে:

> use db1
> db.source_collection.find().forEach( function(x){db.collection_copy.insert(x)} );

সরানো:

> use admin
switched to db admin
> db.runCommand({renameCollection: 'db1.source_collection', to: 'db2.target_collection'}) // who'd think rename could move?

অন্যান্য উত্তরগুলি অনুলিপি করার জন্য আরও ভাল, তবে আপনি যদি তা সরানোর চেষ্টা করছেন তবে এটি বিশেষত কার্যকর।


3
থেক্স দুর্দান্ত কাজ করে! মাত্র 'db1.source_collection'
আন্ডারস

4
"Db.runCommand (..." "এর পরে" অ্যাডমিন ব্যবহার করুন "এর পরিবর্তে আপনি কেবল একটি কমান্ড করতে পারেন," db.adminCommand (... "
হামিদ

25

আমি মঙ্গো ক্লিপ মোঙ্গো ডকের সাথে সংযুক্ত ফাংশনটি অপব্যবহার করব । যাতে এর অর্থ আপনি এক বা একাধিক সংযোগ শুরু করতে পারেন। আপনি যদি একই সার্ভারে গ্রাহক সংগ্রহ পরীক্ষা থেকে টেস্ট 2 তে অনুলিপি করতে চান। প্রথমে আপনি মঙ্গো শেল শুরু করুন

use test
var db2 = connect('localhost:27017/test2')

একটি সাধারণ অনুসন্ধান করুন এবং টেস্ট 2 এ প্রথম 20 রেকর্ডটি অনুলিপি করুন।

db.customer.find().limit(20).forEach(function(p) { db2.customer.insert(p); });

বা কিছু মানদণ্ড দ্বারা ফিল্টার

db.customer.find({"active": 1}).forEach(function(p) { db2.customer.insert(p); });

রিমোট সার্ভারের সাথে সংযোগের জন্য কেবল লোকালহোস্টকে আইপি বা হোস্টনেমে পরিবর্তন করুন। আমি এটি পরীক্ষার জন্য পরীক্ষার ডেটা টেস্ট ডাটাবেসে অনুলিপি করতে ব্যবহার করি।


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

19

দুটি রিমোট মংডোড উদাহরণের মধ্যে থাকলে, ব্যবহার করুন

{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> } 

Http://docs.mongodb.org/manual/references/command/clone Colલેક્શન/ দেখুন


copyIndexesবিকল্প ক্ষেত্র আসলে সম্মানিত করা হয় না। সূচি সর্বদা অনুলিপি করা হয়। সার্ভার -11418 দেখুন
Gianfranco পি।

6
এটি মোড়ুন db.runCommand () অর্থাত্ db.runCommand ({ক্লোন সংগ্রহ): "<col নির্বাচন>", থেকে: "<হোস্টনেম>", ক্যোয়ারী: {<কোয়েরি>}})
ড্যানিয়েল ডি জাওয়ান

এটি কীভাবে এক দূরবর্তী মঙ্গো থেকে অন্য একের জন্য বাড়তি আপডেটের জন্য ব্যবহার করা যেতে পারে?
নিশান্ত

আমার কাছে ডেটা দিন জুড়ে একটি মঙ্গো ইভেন্টে যুক্ত হচ্ছে। দিনের শেষে আমার সদ্য যুক্ত হওয়া সারিগুলি অন্য মঙ্গো দৃষ্টান্তে স্থানান্তর করতে হবে। কিভাবে এটা অর্জন করা যেতে পারে?
নিশান্ত

@ নিশান্তকুমার ক্যোয়ারিতে সেট করার চেষ্টা করুন: {} এই কোড: $ যেখানে: ফাংশন () {আজ = নতুন তারিখ (); // আজ.সেটস আওয়ারস (0,0,0,0); (this._id.getTimestamp ()> = আজ) ফিরে আসুন। স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 42456375/ … দেখুন ।
এস কোলোনে

18

আমি সাধারণত:

use sourcedatabase;
var docs=db.sourcetable.find();
use targetdatabase;
docs.forEach(function(doc) { db.targettable.insert(doc); });

11

বিশাল আকারের সংগ্রহের জন্য, আপনি বাল্ক ইন্ডিয়ার ব্যবহার করতে পারেন ()

var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
    bulk.insert(d);
});
bulk.execute();

এটি অনেক সময় সাশ্রয় করবে । আমার ক্ষেত্রে, আমি 1219 টি নথি দিয়ে সংগ্রহটি অনুলিপি করছি: এটির বনাম বাল্ক (67 সেকেন্ড বনাম 3 সেকেন্ড)


এটি উপায় ভাল, আরও দক্ষ, হাতুড়ি কম ডিবি, যে কোনও আকারের ডেটাসেটের জন্য কাজ করে।
জেরেমি 24'19

যদি আপনি এটি 300k এরও বেশি রেকর্ডের সাথে করে থাকেন তবে আপনাকে সন্ধানের পরে এবং ভবিষ্যদ্বাণী করার আগে একটি .limit (300000) যুক্ত করতে হতে পারে। অন্যথায় সিস্টেম লকআপ করতে পারে। আমি সাধারণত সুরক্ষার জন্য বাল্ক পরিবর্তনগুলি প্রায় 100k-এ সীমাবদ্ধ করি। গণনা এবং সীমাবদ্ধতার ভিত্তিতে লুপের জন্য পুরো জিনিসটি মোড়ানো pping
ত্রিউণক্ষেত্র

6

আপনি আপনার সমস্যা সমাধানের জন্য সম্মিলন কাঠামো ব্যবহার করতে পারেন

db.oldCollection.aggregate([{$out : "newCollection"}])

এটি লক্ষ্য করা উচিত, পুরানো কালেকশন থেকে সূচিগুলি নতুন সংকলনে অনুলিপি করা হবে না।


5

আমি জানি যে এই প্রশ্নের উত্তর দেওয়া হয়েছে তবে কার্সারগুলি প্রবাহিত হওয়ার কারণে আমি ব্যক্তিগতভাবে @ জেসনমিসেসের উত্তরটি দেব না এবং যদি সংগ্রহটি এখনও ব্যবহার করা হয় তবে এটি অসীম কার্সার লুপের কারণ হতে পারে। পরিবর্তে আমি একটি স্ন্যাপশট ব্যবহার করব ():

http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database

@ বেনস উত্তরটিও বেশ ভাল এবং এটি সংগ্রহের হট ব্যাকআপের জন্য ভাল কাজ করে কেবল এটিই নয় তবে একই মংডোড ভাগ করার দরকার নেই মংগেরস্টোর।


5

এটি কেবল একটি বিশেষ কেস হতে পারে তবে দুটি এলোমেলো স্ট্রিং ফিল্ড সহ 100k ডকুমেন্ট সংগ্রহের জন্য (দৈর্ঘ্য 15-20 অক্ষর), একটি বোবা ম্যাপ্রেডুস ব্যবহার করা সন্ধান-সন্নিবেশ / অনুলিপি হিসাবে প্রায় দ্বিগুণ দ্রুত:

db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })

5

পাইমোঙ্গো ব্যবহার করে আপনার একই মংগডে উভয় ডাটাবেস থাকা দরকার, আমি নিম্নলিখিতটি করেছি:


db = মূল ডাটাবেস
db2 = ডাটাবেস অনুলিপি করা

cursor = db["<collection to copy from>"].find()
for data in cursor:
    db2["<new collection>"].insert(data)

1
যদি ডেটার আকার বিশাল হয় তবে এটি অনেক সময় নিতে পারে। বিকল্পভাবে আপনি বাল্ক_ইনসেট
নিশান্ত

1
হ্যাঁ, এটি আমার পক্ষে কাজ করার জন্য কেবলমাত্র একটি দ্রুত এবং নোংরা উপায় ছিল, আমার ডাটাবেসটি খুব বড় নয়, তবে ছোটও নয় এবং খুব বেশি সময়ও নেয় নি, তবে হ্যাঁ আপনি সঠিক।
ভবক্তা

2

এটি আপনার সমস্যার সমাধান করবে না তবে মংডোব শেলের একটি copyToপদ্ধতি রয়েছে যা একই ডাটাবেসে অন্য একটিতে অনুলিপি করে :

db.mycoll.copyTo('my_other_collection');

এটি BSON থেকে JSON এও অনুবাদ করে, তাই mongodump/ যাওয়ার mongorestoreসবচেয়ে ভাল উপায় হ'ল অন্যেরা যেমন বলেছেন।


চমৎকার। দুঃখজনকভাবে মঙ্গো শেল রেফারেন্সটি এই পদ্ধতির উল্লেখ করেছে বলে মনে হয় না।
pgl

হ্যাঁ, আমি জানি, তবে মংগোডিবি শেলটি দুর্দান্ত, যদি আপনি db.collname টাইপ করেন [[টিএবি] আপনি সংগ্রহ অবজেক্টে সমস্ত উপলব্ধ পদ্ধতি দেখতে পাবেন। এই টিপ অন্যান্য সমস্ত অবজেক্টের জন্য কাজ করে।
রবার্তো

সমস্যাটি হ'ল সেই আদেশগুলির জন্য সহায়তার অভাব! কোড কলটিতে প্যারেন্সকে বাদ দিয়ে কোডটি দেখতে সক্ষম হওয়া কার্যকর।
pgl

2
দুঃখজনকভাবে, এই কমান্ডটি এখন সংস্করণ 3.0 থেকে অবচয় করা হয়েছে।
হ্যারি

2

র‌্যাম যদি কোনও সমস্যা না insertManyহয় তবে এটি forEachলুপের চেয়ে দ্রুত ।

var db1 = connect('<ip_1>:<port_1>/<db_name_1>')
var db2 = connect('<ip_2>:<port_2>/<db_name_2>')

var _list = db1.getCollection('collection_to_copy_from').find({})
db2.collection_to_copy_to.insertMany(_list.toArray())

1

যদি কিছু হিরকু ব্যবহারকারী এখানে হোঁচট খায় এবং আমার পছন্দ মতো ডাটাবেস স্টেজ থেকে প্রোডাকশন ডাটাবেসে কিছু তথ্য অনুলিপি করতে চান বা তদ্বিপরীত আপনি এখানে এটি খুব সহজেই কীভাবে করেন (এনবি আশা করি সেখানে কোনও টাইপস নেই, এটি এটিএম পরীক্ষা করতে পারবেন না।) আমি asap কোডটির বৈধতা নিশ্চিত করার চেষ্টা করব):

to_app="The name of the app you want to migrate data to"
from_app="The name of the app you want to migrate data from"
collection="the collection you want to copy"
mongohq_url=`heroku config:get --app "$to_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
to_token=${parts[0]}; to_url=${parts[1]}; to_db=${parts[2]}
mongohq_url=`heroku config:get --app "$from_app" MONGOHQ_URL`
parts=(`echo $mongohq_url | sed "s_mongodb://heroku:__" | sed "s_[@/]_ _g"`)
from_token=${parts[0]}; from_url=${parts[1]}; from_db=${parts[2]}
mongodump -h "$from_url" -u heroku -d "$from_db" -p"$from_token" -c "$collection" -o col_dump
mongorestore -h "$prod_url" -u heroku -d "$to_app" -p"$to_token" --dir col_dump/"$col_dump"/$collection".bson -c "$collection"

1

আপনি সর্বদা রোবমঙ্গো ব্যবহার করতে পারেন। V0.8.3 অনুসারে একটি সরঞ্জাম রয়েছে যা সংগ্রহের উপর ডান ক্লিক করে এবং "ডেটাবেজে সংগ্রহের অনুলিপি" নির্বাচন করে এটি করতে পারে

বিস্তারিত জানার জন্য http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/ দেখুন

এই বৈশিষ্ট্যটি বগি প্রকৃতির কারণে 0.8.5-এ সরানো হয়েছে সুতরাং আপনি যদি এটি চেষ্টা করতে চান তবে আপনাকে 0.8.3 বা 0.8.4 ব্যবহার করতে হবে।


6
রোবমঙ্গোর এই বৈশিষ্ট্যটি এখনও অস্থির। এটি কাজ করার জন্য এটি একটি 50/50 সুযোগ।
থিডি

2
এটি 0.8.5 থেকে সরিয়ে ফেলা হয়েছে বলে মনে হচ্ছে
ক্যারাসেল

0

আমার ক্ষেত্রে, আমার নতুন সংগ্রহে আমাকে পুরানো সংগ্রহ থেকে গুণাবলির একটি উপসেট ব্যবহার করতে হয়েছিল। সুতরাং আমি নতুন সংগ্রহে সন্নিবেশ কল করার সময় সেই বৈশিষ্ট্যগুলি বেছে নিয়ে শেষ করেছি।

db.<sourceColl>.find().forEach(function(doc) { 
    db.<newColl>.insert({
        "new_field1":doc.field1,
        "new_field2":doc.field2,
        ....
    })
});`

0

ডেটাবেস, সংগ্রহ বা নির্দিষ্ট সংগ্রহ ডাউনলোড লিঙ্কটিতে ক্লিক করে রফতানি এবং আমদানি সরঞ্জাম রয়েছে এমন "স্টুডিও 3 টি ফর মোঙ্গোডিবি" ব্যবহার করুন: https://studio3t.com/download/


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