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使用了计算功能。找到一个链接-