2017-01-31 2 views
11

У меня есть три модели: user, noun и usernoun (user_noun в PHP/Eloquent). Существует много-много отношений между user и noun. Таблица «pivot» имеет дополнительный атрибут score. Я могу использовать этот запрос с красноречивым просуммировать баллы каждого существительного пользователя должен получить общий балл пользователя:Как выбрать, groupBy и присоединиться к Waterline или 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) 
    }) 
}) 

Может это родной запрос переписывается в ватерлинии с groupBy и populate и sum?

ответ

0

Вы не можете делать соединения с ватерлинией на данный момент, вам придется использовать необработанные запросы для этого. populate будет просто заполнять связанные поля, это не возвращает вам результат, как это делает sql join.

ватерлинии в данный момент поддерживается только с помощью GroupBy в комбинации с суммой(), 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

Не удалось найти точный документ, но я попробовал запрос, groupby in паруса работает с калькуляционной функцией. Найдено одна ссылка - 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); 
}); 
Смежные вопросы