এটি করার কোন সহজ পথ আছে কি?
এটি করার কোন সহজ পথ আছে কি?
উত্তর:
এই মুহূর্তে মঙ্গোডিবিতে কোনও আদেশ নেই যা এটি করবে। সম্পর্কিত বৈশিষ্ট্যের অনুরোধের সাথে দয়া করে JIRA টিকিটটি নোট করুন ।
আপনি যেমন কিছু করতে পারেন:
db.<collection_name>.find().forEach(function(d){ db.getSiblingDB('<new_database>')['<collection_name>'].insert(d); });
দয়া করে মনে রাখবেন যে এটির সাথে, দুটি ডাটাবেসটির কাজ করার জন্য একই মঙ্গোদ ভাগ করা প্রয়োজন।
এগুলি ছাড়াও, আপনি একটি ডাটাবেস থেকে সংগ্রহের একটি মংডাম্প্প করতে পারেন এবং তারপরে সংগ্রহটি অন্য ডাটাবেসে সংগ্রহ করতে পারেন।
সবচেয়ে ভাল উপায়টি হল মংডোম্প্প করা তারপর মংগেরস্টোর।
আপনি এর মাধ্যমে সংগ্রহটি নির্বাচন করতে পারেন:
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
।
আসলে, সেখানে হয় একটি কমান্ড সরানো এক ডাটাবেসের থেকে অন্য একটা সংকলন। এটিকে কেবল "সরানো" বা "অনুলিপি" বলা হয় না।
কোনও সংগ্রহ অনুলিপি করতে, আপনি এটি একই ডিবিতে ক্লোন করতে পারেন, তারপরে ক্লোনটি সরান।
ক্লোন করতে:
> 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?
অন্যান্য উত্তরগুলি অনুলিপি করার জন্য আরও ভাল, তবে আপনি যদি তা সরানোর চেষ্টা করছেন তবে এটি বিশেষত কার্যকর।
'db1.source_collection'
আমি মঙ্গো ক্লিপ মোঙ্গো ডকের সাথে সংযুক্ত ফাংশনটি অপব্যবহার করব । যাতে এর অর্থ আপনি এক বা একাধিক সংযোগ শুরু করতে পারেন। আপনি যদি একই সার্ভারে গ্রাহক সংগ্রহ পরীক্ষা থেকে টেস্ট 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); });
রিমোট সার্ভারের সাথে সংযোগের জন্য কেবল লোকালহোস্টকে আইপি বা হোস্টনেমে পরিবর্তন করুন। আমি এটি পরীক্ষার জন্য পরীক্ষার ডেটা টেস্ট ডাটাবেসে অনুলিপি করতে ব্যবহার করি।
দুটি রিমোট মংডোড উদাহরণের মধ্যে থাকলে, ব্যবহার করুন
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> }, copyIndexes: <true|false> }
Http://docs.mongodb.org/manual/references/command/clone Colલેક્શન/ দেখুন
copyIndexes
বিকল্প ক্ষেত্র আসলে সম্মানিত করা হয় না। সূচি সর্বদা অনুলিপি করা হয়। সার্ভার -11418 দেখুন
বিশাল আকারের সংগ্রহের জন্য, আপনি বাল্ক ইন্ডিয়ার ব্যবহার করতে পারেন ()
var bulk = db.getSiblingDB(dbName)[targetCollectionName].initializeUnorderedBulkOp();
db.getCollection(sourceCollectionName).find().forEach(function (d) {
bulk.insert(d);
});
bulk.execute();
এটি অনেক সময় সাশ্রয় করবে । আমার ক্ষেত্রে, আমি 1219 টি নথি দিয়ে সংগ্রহটি অনুলিপি করছি: এটির বনাম বাল্ক (67 সেকেন্ড বনাম 3 সেকেন্ড)
আপনি আপনার সমস্যা সমাধানের জন্য সম্মিলন কাঠামো ব্যবহার করতে পারেন
db.oldCollection.aggregate([{$out : "newCollection"}])
এটি লক্ষ্য করা উচিত, পুরানো কালেকশন থেকে সূচিগুলি নতুন সংকলনে অনুলিপি করা হবে না।
আমি জানি যে এই প্রশ্নের উত্তর দেওয়া হয়েছে তবে কার্সারগুলি প্রবাহিত হওয়ার কারণে আমি ব্যক্তিগতভাবে @ জেসনমিসেসের উত্তরটি দেব না এবং যদি সংগ্রহটি এখনও ব্যবহার করা হয় তবে এটি অসীম কার্সার লুপের কারণ হতে পারে। পরিবর্তে আমি একটি স্ন্যাপশট ব্যবহার করব ():
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
@ বেনস উত্তরটিও বেশ ভাল এবং এটি সংগ্রহের হট ব্যাকআপের জন্য ভাল কাজ করে কেবল এটিই নয় তবে একই মংডোড ভাগ করার দরকার নেই মংগেরস্টোর।
এটি কেবল একটি বিশেষ কেস হতে পারে তবে দুটি এলোমেলো স্ট্রিং ফিল্ড সহ 100k ডকুমেন্ট সংগ্রহের জন্য (দৈর্ঘ্য 15-20 অক্ষর), একটি বোবা ম্যাপ্রেডুস ব্যবহার করা সন্ধান-সন্নিবেশ / অনুলিপি হিসাবে প্রায় দ্বিগুণ দ্রুত:
db.coll.mapReduce(function() { emit(this._id, this); }, function(k,vs) { return vs[0]; }, { out : "coll2" })
পাইমোঙ্গো ব্যবহার করে আপনার একই মংগডে উভয় ডাটাবেস থাকা দরকার, আমি নিম্নলিখিতটি করেছি:
db = মূল ডাটাবেস
db2 = ডাটাবেস অনুলিপি করা
cursor = db["<collection to copy from>"].find()
for data in cursor:
db2["<new collection>"].insert(data)
এটি আপনার সমস্যার সমাধান করবে না তবে মংডোব শেলের একটি copyTo
পদ্ধতি রয়েছে যা একই ডাটাবেসে অন্য একটিতে অনুলিপি করে :
db.mycoll.copyTo('my_other_collection');
এটি BSON থেকে JSON এও অনুবাদ করে, তাই mongodump
/ যাওয়ার mongorestore
সবচেয়ে ভাল উপায় হ'ল অন্যেরা যেমন বলেছেন।
র্যাম যদি কোনও সমস্যা না 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())
যদি কিছু হিরকু ব্যবহারকারী এখানে হোঁচট খায় এবং আমার পছন্দ মতো ডাটাবেস স্টেজ থেকে প্রোডাকশন ডাটাবেসে কিছু তথ্য অনুলিপি করতে চান বা তদ্বিপরীত আপনি এখানে এটি খুব সহজেই কীভাবে করেন (এনবি আশা করি সেখানে কোনও টাইপস নেই, এটি এটিএম পরীক্ষা করতে পারবেন না।) আমি 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"
আপনি সর্বদা রোবমঙ্গো ব্যবহার করতে পারেন। V0.8.3 অনুসারে একটি সরঞ্জাম রয়েছে যা সংগ্রহের উপর ডান ক্লিক করে এবং "ডেটাবেজে সংগ্রহের অনুলিপি" নির্বাচন করে এটি করতে পারে
বিস্তারিত জানার জন্য http://blog.robomongo.org/whats-new-in-robomongo-0-8-3/ দেখুন
এই বৈশিষ্ট্যটি বগি প্রকৃতির কারণে 0.8.5-এ সরানো হয়েছে সুতরাং আপনি যদি এটি চেষ্টা করতে চান তবে আপনাকে 0.8.3 বা 0.8.4 ব্যবহার করতে হবে।
আমার ক্ষেত্রে, আমার নতুন সংগ্রহে আমাকে পুরানো সংগ্রহ থেকে গুণাবলির একটি উপসেট ব্যবহার করতে হয়েছিল। সুতরাং আমি নতুন সংগ্রহে সন্নিবেশ কল করার সময় সেই বৈশিষ্ট্যগুলি বেছে নিয়ে শেষ করেছি।
db.<sourceColl>.find().forEach(function(doc) {
db.<newColl>.insert({
"new_field1":doc.field1,
"new_field2":doc.field2,
....
})
});`
ডেটাবেস, সংগ্রহ বা নির্দিষ্ট সংগ্রহ ডাউনলোড লিঙ্কটিতে ক্লিক করে রফতানি এবং আমদানি সরঞ্জাম রয়েছে এমন "স্টুডিও 3 টি ফর মোঙ্গোডিবি" ব্যবহার করুন: https://studio3t.com/download/
এটি মঙ্গোর db.copyDatabase
পদ্ধতি ব্যবহার করে করা যেতে পারে :
db.copyDatabase(fromdb, todb, fromhost, username, password)
তথ্যসূত্র: http://docs.mongodb.org/manual/references/method/db.copyDatabase/