2013-07-22 29 views
7

PHP'nin Mongo sürücüsü bir renameCommand işlevinden yoksundur. Bunu yönetici veritabanı üzerinden yapmak için There is reference. Ancak, Mongo sürücüsünün daha yeni sürümlerinde, bu veritabanında oturum açma yetkiniz yoksa, yönetici veritabanını "kullanmanıza" izin vermez. Yani bu yöntem artık çalışmıyor. Ben de şu anda bu benim için bir ilgi olmamasına rağmen, bu keskinleştirilmiş ortamlarda işe yaramadı okudum.PHP'de Mongo Koleksiyonunu Yeniden Adlandırma

İnsanların sahip olduğu diğer öneri, "koleksiyon" koleksiyonunu takip etmek ve "to" koleksiyonuna eklemek. Uygun WriteConcern (yangın ve unut) ile bu oldukça hızlı olabilir. Ancak yine de, ağ üzerindeki her kaydı PHP sürecine çekmek ve daha sonra ağ üzerinden tekrar veritabanına geri yüklemek demektir.

Tüm sunucu tarafını yapmak için ideal bir yol istiyorum. SQL'de bir INSERT INTO ... SELECT ... gibi sıralayın. Bu şekilde hızlı, ağda verimli ve PHP'de düşük bir yük.

cevap

0

Güncellemeler:

  • kaldırıldı benim eski harita/buldum (ve Sammaye işaret) beri bu ben nasıl öğrendiğinden beri
  • ikincil benim exec versiyonunu Yapılan yapısını değiştiren yöntemi azaltmak renameCollection ile yapın.

Bir çözüm bulduğuma inanıyorum. PHP sürücüsünün bazı sürümlerinin, gerekmediği halde yönetici veritabanına karşı auth olacağı anlaşılıyor. Ancak authSource bağlantı paramının bu davranışı değiştirmek için kullanıldığı a workaround var, bu nedenle yönetici veritabanına karşı değil, istediğiniz veritabanı. Şimdi benim renameCollection işlevim yeniden renameCollection komutunun etrafındaki sarıcıdır.

Anahtar, bağlantı kurulurken authSource eklemektir. Aşağıdaki kodda $ _ENV ['MONGO_URI'] bağlantı dizgimi tutar ve default_database_name() auth'a karşı kullanmak istediğim veritabanının adını döndürür.

$class = 'MongoClient'; 
if(!class_exists($class)) $class = 'Mongo'; 
$db_server = new $class($_ENV['MONGO_URI'].'?authSource='.default_database_name()); 

İşte bazı çevreler size eval izin vermez rağmen de çalışması gerekir eval (size özel bir sisteme sahip olmadıkça MongoLab size sakat bir kurulum verir) kullanılan benim eski bir sürümüdür. Ama keskin bir ortamda koşuyorsanız, bu makul bir çözüm gibi görünüyor. (http://docs.mongodb.org/manual/reference/command/renameCollection/) tasarlandığı gibi ben sadece bu test ettik

function renameCollection($old_name, $new_name) { 
    db()->$new_name->drop(); 
    $copy = "function() {db.$old_name.find().forEach(function(d) {db.$new_name.insert(d)})}"; 
    db()->execute($copy); 
    db()->$old_name->drop(); 
} 
+0

MR iki koleksiyonlar arasında belge yapısını değiştirecek ve size doğru AUTH – Sammaye

+0

Yea varsa yönetici veritabanı "kullanmak" gerekir, ben fark etmedi olarak zamanından önce bu yayınlanmıştır fark yapı değişiyor. Şu anda bir haritayı nasıl yapabileceğimi/azaltma parçası olmadan nasıl azaltabileceğimi bulmaya çalışıyorum. –

+0

Düşüşün temelde, içsel olarak, MongoDB'nin ortaya çıkan belgeleri nasıl oluşturduğunu ve yazdığını sorun değil. Aslında, hiçbir zaman belge başına bir anahtar döndürmeniz gerekmediğinden ve MongoDBs azaltma işlemi böyle bir durumda çalışmadığı için azalmayı asla çalıştırmamalısınız. – Sammaye

0

, çalışır: Bir unsharded koleksiyon adlandırmak nasıl

$mongo->admin->command(array('renameCollection'=>'ns.user','to'=>'ns.e')); 

olduğunu That. MR ile ilgili bir problem, orijinal koleksiyondan çıktının şeklini değiştirmesidir. Bu nedenle bir koleksiyonu kopyalamakta pek iyi değil. Koleksiyonunuz bittiğinde el ile kopyalamaktan daha iyi olur.

Ek bir not olarak 1.4.2'ye yükselttim (bazı nedenler pecl kanalından phpinfo() 'ya 1.4.3dev :S olarak geliyor) ve hala çalışıyor. Bunu kullanabilirsin

+0

ile doluysa yapman gereken şey budur. Ancak, mongo sürücüsünü (1.4.1'e) yükselttiğimden beri, kimlik doğrulama hakkında şikayette bulunmayı bıraktı. Hala eski mongo sürücüsünde başka bir makinem var ve hala çalışıyor, bu yüzden bir veritabanı izin sorunu olmadığını biliyorum. –

+0

@EricAnderson 1.4.2'deyim ve bu sorunu alamıyorum – Sammaye

+0

Belki 1,4.1 özgü. Https://jira.mongodb.org/browse/PHP-782 adresinden authSource kullanarak bir geçici çözüm sağlayan bir sorun buldum. Yani şimdi sadece renameCollection kullanarak. Tüm bunları anladığın için teşekkürler. –

-1

. "dropTarget" bayrağı doğruysa mevcut veritabanını silin.

$mongo = new MongoClient('_MONGODB_HOST_URL_'); 
    $query = array("renameCollection" => "Database.OldName", "to" => "Database.NewName", "dropTarget" => "true"); 

    $mongo->admin->command($query); 
+0

Bu, sorunu ele almıyor. Sorun, renameCommand'ın her zaman kimlik bilgilerine ve Mongo sürücüsü sürümüne bağlı olarak çalışmadığıdır. Komutu dropTarget ile çalıştırmak, yapmaya çalıştığım şeydi. Yönetici veritabanında imtiyazlarınız yoksa veya PHP mongo sürücüsünün belirli sürümlerini kullanıyorsanız, her zaman işe yaramaz. –

İlgili konular