2015-05-12 23 views
15

şöyle der: "sürüm 3.0 Değişen: dropDups seçenek artık mevcut değil."Mongo 3 çiftleri - dropDups mongodb için belgelerde

(downgrading hariç) Yapabileceğim bir şey aslında benzersiz bir dizin oluşturmak ve yinelenen girdileri yok etmek istiyorsanız var mı?

Ben sadece tüm çiftleri silmek ve hiçbiri Ben bitirdim indeksleme olduğum zaman gelecek umut edemez bu yüzden saniyede yaklaşık 300 ekler almak lütfen unutmayın. o süreçte silinecek hangi belge doğru tahmin etmek mümkün değildi çünkü

+0

için paket kaynak kodunu kontrol edin. Sorunuzu anlamıyorum. Yinelenen dosyalar da dahil olmak üzere mevcut belgeleriniz var mı ve şimdi çiftler ile iletişim kurarken benzersiz bir dizin koymak ister misiniz? –

+1

evet. Çiftlerden kurtulmak istiyorum ve eğer yenileri onları reddederse. – Alonzorz

+0

Ben de bu konuda sıkışmış ettik, MongoDB> = 3. * 'dropDups' olmadan çiftleri kurtulmak için nasıl bir alternatif var mı? –

cevap

11

Evet dropDupes sürümü 2.7.5 beri şimdi deprecated olduğunu.

  1. yeni bir koleksiyon kullanın: Yeni bir koleksiyon oluşturma

    • ,
    • bu yeni koleksiyonunda benzersiz bir dizin oluşturun
    • Run

      Genellikle, 2 seçeneğiniz var Tüm dökümanları eski koleksiyondan yenisine kopyalamak ve işlem sırasında yinelenen anahtar hatasını göz ardı ettiğinizden emin olun. Elle kendi koleksiyonunda onunla

  2. Deal:

    • (çiftleri silmek için koleksiyonu toplu çalıştırın kodunuzda daha yinelenen belgeleri eklemek olmaz emin olun ve tamamen aynı değilse iyi olanı sakladığınızdan emin olun),
    • ardından benzersiz dizini ekleyin.
    • şimdi böylece kodunu güncelleyin

      • benzersiz dizini ile yeni bir koleksiyon oluşturun: bir özel durum için

, ben ilk seçeneği tavsiye ama bir numara ile olur d görmezden (hem tablolarda belgeleri eklemek

  • yenisine eski koleksiyondan tüm belgeleri kopyalamak için bir toplu çalıştırın yeni anahtar, eski adla eşleşecek şekilde yeniden adlandırılır. artık sadece bir koleksiyondan çiftleri kaldırmak için bir toplu komut dosyası oluşturabilir @ Maxime-Beugnet tarafından vurgulandığı gibi "eski" koleksiyonu
  • +1

    Seçenek 1, muhtemelen, indeksleri yeniden oluşturmak için gitmek için en iyi yoldur, çünkü bir canlı sistem indeksleri yeniden oluşturmak için onu yavaşlatacak şekilde beklemek zorunda kalacaktır. – Pykler

    +0

    'İşlem sırasında yinelenen anahtar hatasını yok saydığınızdan emin olun. Bunu nasıl yaparsınız? Hatalar işlemin ortasında durduğunu düşünüyor – Quest

    +1

    MongoDB sırasız toplu eklemeleri kullan: "Yazma işlemlerinden birinin işlenmesi sırasında bir hata oluşursa, MongoDB listede kalan yazma işlemlerini işlemeye devam edecektir." Örnek: db.persons.insert ([{"_ id": "Bob"}, {"_id": "John"}, {"_id": "Bob"}, {"_id": "Marc"}] , {order: false}) 3 doküman ekleyecek ve bir çift anahtar hatası gösterecektir. {Order: true} ile yalnızca ilk 2 eklenir. Daha fazla doc [here] (https://docs.mongodb.com/manual/reference/method/db.collection.initializeUnorderedBulkOp/#db.collection.initializeUnorderedBulkOp) –

    6

    yazmak yüzden

  • kodunuzu yeniden güncelleyin. Yaklaşımımın, toplama sayısına göre küçük olması durumunda, göreceli olarak hızlı olan yaklaşımımı dahil ettim.

    db.numbers.drop() 
    
    var counter = 0 
    while (counter<=100000){ 
        db.numbers.save({"value":counter}) 
        db.numbers.save({"value":counter}) 
        if (counter % 2 ==0){ 
        db.numbers.save({"value":counter}) 
        } 
        counter = counter + 1; 
    } 
    

    Birden fazla kopya ile tüm kayıtları döndüren bir agrega sorgusu yazarak bu koleksiyonda çiftleri kaldırabilirsiniz: Gösteri amaçlı bu komut dosyası aşağıdaki komut dosyası tarafından oluşturulan koleksiyon tekilleştirir. Sonra yinelenen kayıtları üzerinde yineleme ve kaldırmak için yinelenenlerin karar için kendi iş mantığını uygulayabilirsiniz imleci kullanarak

    var cur = db.numbers.aggregate([{ $group: { _id: { value: "$value" }, uniqueIds: { $addToSet: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } }]); 
    

    .

    db.numbers.createIndex({"value":1},{unique:true}) 
    
  • 0

    mongo_remove_duplicate_indexes

    iyi yolu yüklemek pip yapacaktır:

    while (cur.hasNext()) { 
        var doc = cur.next(); 
        var index = 1; 
        while (index < doc.uniqueIds.length) { 
         db.numbers.remove(doc.uniqueIds[index]); 
         index = index + 1; 
        } 
    } 
    

    kopyaların kaldırılmasından sonra bir benzersiz dizin ekleyebilirsiniz: Örnekte aşağıda ben sadece ilk geçtiği tutuyorum Bir python betiği oluşturmak veya istediğiniz herhangi bir dilde oluşturmak, koleksiyonu yinelemek, db.collectionname.createIndex ({'inde xname ': 1}, benzersiz: true) ve belgelerinizi önceki koleksiyondan yeni koleksiyona ekleyin ve ayrı veya çoğaltılmış olmak istediğiniz anahtar yeni koleksiyona eklenmeyeceğinden ve ecxeption'ı istisna ile kolayca kaldırabileceğinden

    kullanım kılavuzuna bakın.