Mongodb sort documents by complex computed value

后端 未结 1 1197
无人及你
无人及你 2021-01-20 10:52
items = collection.aggregate([
        {\"$match\": {}},
        {\"$project\": {
            \'temp_score\': {
                \"$add\": [\"$total_score\", 100],
           


        
相关标签:
1条回答
  • 2021-01-20 11:31

    Your $temp_score and $temp_votes are not existing yet in your $divide.

    You can do another $project :

    db.user.aggregate([{
        "$project": {
            'temp_score': {
                "$add": ["$total_score", 100],
            },
            'temp_votes': {
                "$add": ["$total_votes", 20],
            }
        }
    }, {
        "$project": {
            'temp_score':1,
            'temp_votes':1,
            'weight': {
                "$divide": ["$temp_score", "$temp_votes"]
            }
        }
    }])
    

    or re-computing temp_score and temp_votes in $divide :

    db.user.aggregate([{
        "$project": {
            'temp_score': {
                "$add": ["$total_score", 100],
            },
            'temp_votes': {
                "$add": ["$total_votes", 20],
            },
            'weight': {
                "$divide": [
                    { "$add": ["$total_score", 100] },
                    { "$add": ["$total_votes", 20] }
                ]
            }
        }
    }]);
    

    You can also do this in one single $project using the $let operator that will be used to create 2 variables temp_score and temp_votes. But the results will be accessible under a single field (here total) :

    db.user.aggregate([{
        $project: {
            total: {
                $let: {
                    vars: {
                        temp_score: { $add: ["$total_score", 100] },
                        temp_votes: { $add: ["$total_votes", 20] }
                    },
                    in : {
                        temp_score: "$$temp_score",
                        temp_votes: "$$temp_votes",
                        weight: { $divide: ["$$temp_score", "$$temp_votes"] }
                    }
                }
            }
        }
    }])
    
    0 讨论(0)
提交回复
热议问题