2017-01-31 14 views
11

我有三個模型:user,noun,和usernounuser_noun在PHP/Eloquent)。 usernoun之間有多對多的關係。 「數據透視表」有一個額外的屬性score。我可以用這個查詢與雄辯,總結每個名詞的分數用戶必須得到用戶的總比分:如何選擇,groupBy,並加入水線或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(); 

但我無法弄清楚如何得到這個在水線工作。這有效,但不是當我取消註釋.populate('user')行時。我需要填寫user

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

這裏是一個.native()查詢工作:

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

可以這樣本地查詢在水線被改寫爲groupBypopulatesum

回答

0

截至目前您無法與水線連線,您必須使用原始查詢。填充只會填充關聯的字段,它不會以sql連接返回結果的方式返回結果。

水線在這一點上僅支持使用GROUPBY結合 用SUM(),COUNT()等

對於GROUPBY和排序可以使用下列內容:

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

能否請您分享引用鏈接的' groupBy'和'sum'方法? – Sangharsh

+0

無法找到確切的文檔,但我試過查詢,在sails groupby與計算功能。找到一個鏈接 - http://stackoverflow.com/questions/20254910/how-do-i-perform-this-query-using-sailsjs-orm-waterline –

5

由於[email protected],唯一的方法是使用原生查詢。

順便說一句,你可以導出你的方法在用戶模型中:

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

}; 

而且你可以通過調用使用它在你的控制器:

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