我有三个模型: user
, noun
, 和 usernoun
(在PHP/Eloquent中为user_noun
)。user
和 noun
之间有一个多对多的关系。 "pivot" 表格有一个额外的属性 score
。 我可以使用 Eloquent 查询来计算每个用户所获得的分数总和,其中包括他们拥有的每个名词的分数:
$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();
但是我不知道该怎么让它在Waterline中工作。这段代码本来可以运行,但当我取消注释.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
在Waterline中进行重写?
groupBy
和sum
方法的参考链接? - Sangharsh