Php 如何在Waterline或MongoDB中选择、分组和加入
我有三个模型:Php 如何在Waterline或MongoDB中选择、分组和加入,php,mongodb,eloquent,sails.js,waterline,Php,Mongodb,Eloquent,Sails.js,Waterline,我有三个模型:user、noun、和usernoun(user\u noon,在PHP/eloont中)。用户和名词之间存在多对多关系。“pivot”表有一个额外的属性score。我可以使用此查询对用户必须获得的每个名词的总分进行求和: $users = User::leftJoin('noun_user', 'user.id', 'noun_user.user_id') ->groupBy('user.id') ->select('user.*', DB::raw(
user
、noun
、和usernoun
(user\u noon
,在PHP/eloont中)。用户
和名词
之间存在多对多关系。“pivot”表有一个额外的属性score
。我可以使用此查询对用户必须获得的每个名词的总分进行求和:
$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)
})
})
是否可以在Waterline中使用
groupBy
和populate
和sum
重写此本机查询?到目前为止,您无法使用Waterline进行连接,您必须使用原始查询。“填充”将只填充相关字段,它不会像sql join返回结果那样返回结果
此时水线仅支持组合使用groupBy
使用sum()、count()等
对于groupby和sort,您可以使用以下内容:
Model.find()
.groupBy('term')
.sum('count')
.limit(20)
.sort({count: 'desc'})
.exec(function (err, data){
//Your code here..
});
截至Waterline@0.11.8,唯一的方法是使用本机查询 顺便说一下,您可以在用户模型内导出方法:
// 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);
});
您可以分享
groupBy
和sum
方法的参考链接吗?无法找到确切的文档,但我尝试了查询,sails中的groupBy使用了计算功能。找到一个链接-