簡體   English   中英

如何按加權值排序

[英]How to Sort by Weighted Values

我有一個問題,我想根據另一個集合的字段值對查詢結果進行排序,

問題:我想首先讓用戶獲得123個朋友,然后獲取他們的帖子,然后使用朋友的強度值對帖子進行排序,

我有這個 :

POST COLLECTON:
{
    user_id: 8976,
    post_text: 'example working',
}
{
    user_id: 673,
    post_text: 'something',
}

USER COLLECTON:
{
    user_id: 123,
    friends: {
        {user_id: 673,strength:4}
        {user_id: 8976,strength:1}
    }
}

根據您從用戶中檢索到的信息,您實際上希望進行如下所示的聚合框架查詢:

db.posts.aggregate([
    { "$match": { "user_id": { "$in": [ 673, 8976 ] } } },
    { "$project": {
        "user_id": 1,
        "post_text": 1,
        "weight": {
            "$cond": [
                { "$eq": [ "$user_id", 8976 ] },
                1,
                { "$cond": [ 
                    { "$eq": [ "$user_id", 673 ] },
                    4,
                    0
                ]}
            ]
        }
    }},
    { "$sort": { "weight": -1 } }
])

那么為什么不聚合就聚合呢? 如您所見,聚合框架所做的不僅僅是聚合。 在這里,它用於將新字段“投影”到文檔中,並用“權重”進行填充。 這使您可以按希望排序結果的值將結果重新排序。

當然,您需要以一種對所有數據所做的“生成的”方式,將初始數據從原始數據轉換為該表單。 這需要幾個步驟,但是在這里,我將介紹實現它的JavaScript方法,該方法應該很容易轉換為大多數語言

還要假設您的實際“用戶”看起來更像這樣,這將是有效的:

{
    "user_id": 123,
    "friends": [
        { "user_id": 673,  "strength": 4 },
        { "user_id": 8976, "strength": 1 }
    ]
}

從這樣的對象中,然后構造聚合管道:

// user is the structure shown above

var stack = [];
args = [];

user.friends.forEach(function(friend) {

    args.push( friend.user_id );

    var rec = {
        "$cond": [
            { "$eq": [ "user_id", friend.user_id ] },
            friend.strength
        ]
    };

    if ( stack.length == 0 ) {
        rec["$cond"].push(0);
    } else {
        var last = stack.pop();
        rec["$cond"].push( last );
    }

    stack.push( rec );

});


var pipeline = [
    { "$match": { "user_id": { "$in": args } } },
    { "$project": {
        "user_id": 1,
        "post_text": 1,
        "weight": stack[0]
    }},
    { "$sort": { "weight": -1 } }
];

db.posts.aggregate(pipeline);

這就是全部。 現在,您有了一些代碼,可以瀏覽用戶的“朋友”列表,並構造另一個查詢,以從每個朋友的“強度”值加權得到這些朋友的所有帖子。

當然,通過刪除或更改$match ,您可以通過查詢所有帖子來做幾乎相同的事情,但是保持“權重”投射可以將所有“朋友”帖子“浮動”到頂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM