2016-04-06 17 views
2

Birden çok sütun içeren bir veritabanım var. Bir sütunu ayırt etmeye çalışıyorum, böylece ikinci sütunun sayılarını ekleyebilirim. Yeni bir koleksiyon (tablo) oluşturuyorum. Örnek için : mongodb içinde javascript kullanarak farklı bir sütun

states  race race_1 geo_type 
Alabama 1  3  state 
Alabama 4  1  state 
Alabama 4  1  state 
Alaska  5  1  state 
Alaska  2  1  state 

Yani çıkış olmalıdır.

states  race race_1 geo_type 
Alabama 9  5  state 
Alaska  7  2  state 

Bunun üzerinde çalışmak için Javascript kullanıyorum. JavaScript in bu bir cevap arayan çalıştı

db.race_collection.distinct('states').forEach(function(state_lookup){ 
var race_sum = 0; 

db.race_collection.find({'states': state_lookup}).forEach(function(doc){ 
    if (doc['race']) { 
    race_sum = race_sum + doc['race']; 
    } 
    if (doc['race'] != null) 
     db.indicator_collection.insert({ 
     'race': race_sum, 
      'state': state_lookup 
}) 
}) 
}) 

ama yakın bir şey bulamadı: İşte Ben bugüne kadar ne olduğunu. "race_1"'a henüz taşınamadım, çünkü "yarış"'u bile ekleyemedim. Gerekirse kodumu paramparça edebilirsiniz. Bunu çözmek için Javascript kullanmam önemlidir. Şimdiden teşekkürler.

cevap

1

İstediğiniz sonucu almak için toplama çerçevesini kullanabilirsiniz. Tüm belgeleri $group kullanarak states anahtarıyla gruplayacağınız ve diğer alanların toplamlarını $sum işleciyle hesaplayacak olan aşağıdaki toplama hattını çalıştırın. Gruplandırma içinde diğer alanı geo_type seçmek, $first operatörüyle yapılır.

evre $project_id yerini alacak başka boru hattı $group boru hattından dönen ve diğer alanlar ile birlikte yeni bir alan ekler. toplama boru hattı tarafından döndürülen

belgeler daha sonra $out operatörünü kullanarak başka bir koleksiyona yazılır: Bu çalıştı ve kullanımı kolay

db.race_collection.aggregate([ 
    { 
     "$group": { 
      "_id": "$states", 
      "race": { "$sum": "$race" }, 
      "race_1": { "$sum": "$race_1" }, 
      "geo_type": { "$first": "$geo_type" } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "state": "$_id", 
      "race": 1, 
      "race_1": 1, 
      "geo_type": 1 
     } 
    }, 
    { "$out": "indicator_collection" } 
]) 
+0

. Daha önce toplama kullanmamıştım. Ama, sütun adı için ** "_ id" ** yerine ** "durumlar" ** kullanmak isterse. Hata verir 'durum' nesnede bir ifade olarak tanımlanmalıdır. ** "_ id" ** gerekli. –

+0

Bu durumda bir başka boru hattı aşamasına ihtiyacınız olacak [** '$ project' **] (https://docs.mongodb.org/manual/reference/operator/aggregation/project/#pipe._S_project) $ out' boru hattı, bu '_id' yerini alacak ve yeni alanı ekler. Bunu uygulamak için düzenlememi kontrol et. – chridam

İlgili konular