2017-01-31 71 views
11

Mam trzy modele: user, noun i usernoun (user_noun w PHP/Eloquent). Istnieje wiele do wielu relacji między user i noun. Tabela "przestawna" ma dodatkowy atrybut score. Mogę użyć tej kwerendy z wymowny aby zsumować wyniki każdego rzeczownika użytkownik musi uzyskać łączny wynik użytkownika:Jak wybrać, groupBy i dołączyć do Waterline lub 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(); 

Ale nie mogę dowiedzieć się, jak uzyskać to do pracy w wodnej. To działa, ale nie kiedy odkomentuję linię .populate('user'). Potrzebuję user do zapełnienia.

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

o to .native() zapytanie, które działa:

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) 
    }) 
}) 

Może to rodzimy zapytania być zapisane w Wodnicy z groupBy i populate i sum?

Odpowiedz

0

Nie możesz teraz robić złączeń z linią wodną, ​​musisz użyć do tego nieprzetworzonych zapytań. zapełnij po prostu zapełni powiązane pola, nie zwróci ci wyniku w sposób, w jaki sql join go zwraca.

Wodnicy w tym momencie tylko umożliwia użycie GroupBy w połączeniu z SUM(), count() itp

Dla GroupBy i sortowania można użyć następujących:

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

Czy możesz udostępniać linków referencyjnych dla ' metody groupBy' i 'sum'? – Sangharsh

+0

Nie można znaleźć dokładnego dokumentu, ale wypróbowałem zapytanie, groupby w żagle działa z funkcją obliczeniową. Znaleziono jeden link - http://stackoverflow.com/questions/20254910/how-do-i-perform-this-query-using-sailsjs-orm-waterline –

5

Jak of [email protected], jedynym sposobem na to jest użycie natywnych zapytań.

Nawiasem mówiąc, można wyeksportować metodę wewnątrz modelu użytkownika:

// 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); 
     }); 
    } 

}; 

I można go używać w kontroler poprzez wywołanie:

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