2014-08-28 46 views
5

Tüm kullanıcıları user_totaldocs ve user_totalthings almak istiyorum ve toplam bu değişkenler.Sorgulama ve toplamı mongoose ile

Bu nasıl olabilir?

var user_schema = mongoose.Schema({ 
    local : { 
     ... 
     ... 
     user_id   : String, 
     user_totaldocs : Number, 
     user_totalthings  : Number 
     .... 

    } 
}); 

cevap

12

Bir sonuca hesaplanan alanları eklemek için Aggregation Pipeline kullanabilirsiniz: Burada kullanıcı şema olduğunu. Aşağıda mongo kabuğunu kullanan bazı örnekler vardır, ancak Mongoose'un Aggregate() helper'daki sözdizimi benzerdir.

Örneğin, içinde $add expression kullanabilirsiniz (kullanıcı doküman başına) toplamları hesaplamak için $project stage a:

db.user.aggregate(
    // Limit to relevant documents and potentially take advantage of an index 
    { $match: { 
     user_id: "foo" 
    }}, 

    { $project: { 
     user_id: 1, 
     total: { $add: ["$user_totaldocs", "$user_totalthings"] } 
    }} 
) 

örneğin, bir $sum accumulator ile $group stage kullanmaya gerek birden çok belgede toplamları hesaplamak için:

db.user.aggregate(
    { $group: { 
     _id: null, 
     total:  { $sum: { $add: ["$user_totaldocs", "$user_totalthings"] } }, 
     totaldocs: { $sum: "$user_totaldocs" }, 
     totalthings: { $sum: "$user_totalthings" } 
    }} 
) 

yalnızca bir total alanı isteyebilirsiniz; Birden çok alanı hesaplama örnekleri olarak totaldocs ve totalthings ekledim.

bir grup null arasında _id$group aşamasına geçirilir tüm belgeler değerleri birleştirir, ama aynı zamanda (user_id ile gruplama gibi) burada, diğer kriterler kullanılabilir.

4

Mongodb tarafından sağlanan toplama çerçevesini kullanabilirsiniz.

(tüm kullanıcılar için anlam) toplama genelinde user_totalthings ait user_totaldocs toplamını ve toplamını alıp istiyorsanız, do - -

db.user_schemas.aggregate(
[ 
    { 
    $group : { 
     user_id : null, 
     user_totaldocs: { $sum: "$user_totaldocs"}, // for your case use local.user_totaldocs 
     user_totalthings: { $sum: "$user_totalthings" }, // for your case use local.user_totalthings 
     count: { $sum: 1 } // for no. of documents count 
    } 
    } 
]) 

özellikle kullanıcı için user_totaldocs ve user_totalthings Özetle sizin durumunuzda için (bir kullanıcı için birden çok belge olduğu varsayılmaktadır) koleksiyonu, bu, her kullanıcı için toplamını döndürür DO -

db.user_schemas.aggregate(
[ 
    { 
    $group : { 
     user_id : "$user_id", 
     user_totaldocs: { $sum: "$user_totaldocs"}, // for your case use local.user_totaldocs 
     user_totalthings: { $sum: "$user_totalthings" }, // for your case use local.user_totalthings 
     count: { $sum: 1 } // for no. of documents count 
    } 
    } 
]) 

bireysel kullanıcı kimliği sağlamanız gerek yok. Daha fazla bilgi için

okuyun: 1. http://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group 2. http://docs.mongodb.org/manual/core/aggregation/