2017-01-31 21 views
11

'a nasıl katılırım, grupBy'yi seçin ve bir araya gelmek için üç modelim var: user, noun ve usernoun (0/PHP/Eloquent içinde). user ve noun arasında çok fazla ilişki vardır. "Özet" tablosunun ek bir özniteliği score vardır. Bir kullanıcı kullanıcının toplam puanı almak zorundadır her isim puanları toplamak için anlamlı olan bu sorguyu kullanabilirsiniz:Waterline veya MongoDB

$users = User::leftJoin('noun_user', 'user.id', 'noun_user.user_id') 
    ->groupBy('user.id') 
    ->select('user.*', DB::raw('sum(noun_user.score) as score')) 
    ->orderBy('score', 'desc') 
    ->get(); 

Ama bu Waterline çalışmak nasıl anlamaya olamaz. Bu çalışır, ancak .populate('user') satırını rahatsız ettiğimde değil. Doldurulacak user'a ihtiyacım var. Burada

UserNoun 
    .find({}) 
    //.populate('user') 
    .groupBy('user') 
    .sum('score') 
    .sort({ score: 'desc' }) 
    .exec((err, usernouns) => { 
    return res.json(usernouns) 
}) 

olduğunu çalışan bir .native() sorgusu:

UserNoun.native(function(err, collection) { 
    collection.aggregate([ 
     { 
      $lookup: { 
       from: 'user', 
       localField: 'user', 
       foreignField: '_id', 
       as: 'user' 
      } 
     }, 
     { 
      $group: { _id: '$user', total: { $sum: '$score' } } 
     }, 
     { 
      $sort : { total: -1 } 
     } 
    ]).toArray(function (err, results) { 
     return res.json(results) 
    }) 
}) 

Bu yerel sorgu groupBy ve populate ve sum ile Waterline içinde tekrar yazılabilir mi?

cevap

0

Şu andan itibaren su hattı ile bağlantı kuramıyorsunuz, bunun için ham sorgu kullanmak zorunda kalacaksınız. populate yalnızca ilişkili alanları dolduracak, sonuç size sql birleştirme sonucunu döndürmez. Sadece toplamı() ile kombinasyon yılında GroupBy kullanarak destekler bu noktada

Su hattı, GroupBy için

vs.) (sayım ve sıralama aşağıdaki kullanabilirsiniz:

Model.find() 
.groupBy('term') 
.sum('count') 
.limit(20) 
.sort({count: 'desc'}) 
.exec(function (err, data){ 
//Your code here.. 
}); 
+0

Eğer 'için referans bağlantıları paylaşır mısınız groupBy' ve 'sum' yöntemleri? – Sangharsh

+0

Tam belge bulamıyor, ancak sorgusu denedim, yelkenlerde groupby bir hesaplama fonksiyonuyla çalışıyor. Bir bağlantı bulundu - http://stackoverflow.com/questions/20254910/how-do-i-perform-this-query-using-sailsjs-orm-waterline –

5

olarak [email protected], bunu yapmanın tek yolu, yerel sorgular kullanmaktır.

// User.js 
module.exports = { 

    // ... 

    findTotalScores: function (callback) { 
     UserNoun.native(function(err, collection) { 
      if (err) { 
       return callback(err); 
      } 

      collection.aggregate([ 
       { 
        $lookup: { 
         from: 'user', 
         localField: 'user', 
         foreignField: '_id', 
         as: 'user' 
        } 
       }, 
       { 
        $group: { _id: '$user', total: { $sum: '$score' } } 
       }, 
       { 
        $sort : { total: -1 } 
       } 
      ]).toArray(callback); 
     }); 
    } 

}; 

Ve arayarak controller içerisinde kullanabilirsiniz:

arada

, Kullanıcı modelinin içine yönteminizi aktarabilirsiniz

User.findTotalScores(function (err, results) { 
    return res.json(results); 
});