SORU
2 AĞUSTOS 2012, PERŞEMBE


MongoDB select count(ayrı x) dizin oluşturulmuş bir sütun - büyük veri setleri için benzersiz sayım sonuçları

Çeşitli makaleler ve örnekler üzerinden gitmiş ve henüz bunu yapmak için etkili bir yol bulmak için SQL sorgu MongoDB (orada milyonlarcasatırbelgeler)

İlk girişimi

(bu yinelenen soru neredeyse Mongo equivalent of SQL's SELECT DISTINCT?) örneğin

db.myCollection.distinct("myIndexedNonUniqueField").length

Açıkçası benim veri kümesi çok büyük olduğu için bu hata var

Thu Aug 02 12:55:24 uncaught exception: distinct failed: {
        "errmsg" : "exception: distinct too big, 16mb cap",
        "code" : 10044,
        "ok" : 0
}

İkinci girişim

Deneyin ve bir grup yapmaya karar verdim

db.myCollection.group({key: {myIndexedNonUniqueField: 1},
                initial: {count: 0}, 
                 reduce: function (obj, prev) { prev.count  ;} } );

Ama bu hata mesajı aldım:

exception: group() can't handle more than 20000 unique keys

Üçüncü denemesi

Henüz denemedim ama mapReduce ilgili çeşitli öneriler var

örneğin

Ayrıca

GitHub sadece bir sayısı dönmelidir söz .distinct yöntemi sabitleme bir çekme isteği var gibi görünüyor, ama hala açık: https://github.com/mongodb/mongo/pull/34

Ama burada işe yarayan istediğimi düşündüm bu noktada, hangi konu üzerinde en son? SQL veya ayrı sayımları için başka bir NoSQL DB gidebilir miyim? yoksa verimli bir yolu var mı?

Güncelleme:

Bu resmi dokümanlar iç açıcı değil MongoDB hakkında yorum, bu doğru mu?

http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808

Update2:

Yeni Toplama Çerçeve gibi yorum yukarıdaki cevaplar... (2.1/2.2 ve üstü, kalkınma önizleme, üretim için MongoDB)

http://docs.mongodb.org/manual/applications/aggregation/

CEVAP
2 AĞUSTOS 2012, PERŞEMBE


1) bunu yapmak için En kolay yolu toplama Çerçevesi aracılığıyla. Bu iki alır "$" komutlar: farklı değerleri ile birinci olan gruplar, farklı değerler . hepsi ikinci bir grup

pipeline = [ 
    { $group: { _id: "$myIndexedNonUniqueField"}  },
    { $group: { _id: 1, count: { $sum: 1 } } }
];

//
// Run the aggregation command
//
R = db.runCommand( 
    {
    "aggregate": "myCollection" , 
    "pipeline": pipeline
    }
);
printjson(R);

Eğer Harita ile bunu yapmak istiyorsan 2)/seni Azaltabilir. Bu da iki aşamalı bir süreçtir: ilk aşamada anahtarı için her ayrı değer bir liste. yeni bir koleksiyon inşa ettik İkinci bir sayım yapıyoruz (yeni koleksiyonu.

var SOURCE = db.myCollection;
var DEST = db.distinct
DEST.drop();


map = function() {
  emit( this.myIndexedNonUniqueField , {count: 1});
}

reduce = function(key, values) {
  var count = 0;

  values.forEach(function(v) {
    count  = v['count'];        // count each distinct value for lagniappe
  });

  return {count: count};
};

//
// run map/reduce
//
res = SOURCE.mapReduce( map, reduce, 
    { out: 'distinct', 
     verbose: true
    }
    );

print( "distinct count= "   res.counts.output );
print( "distinct count=", DEST.count() );

Haritanın neden olabilecek 16MB belge boyutu sınırı aşıldı çünkü içi azaltmak/iade edemezsiniz. Sanaolabilirkoleksiyonunda hesaplama kaydetmek ve count() sonra toplama boyutu, ya da mapReduce dönüş değeri sonuç sayısını elde edebilirsiniz().

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boburnham

    boburnham

    11 Temmuz 2006
  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011