gpt4 book ai didi

javascript - 如何按加权值排序

转载 作者:可可西里 更新时间:2023-11-01 10:04:07 24 4
gpt4 key购买 nike

我有这个问题,我想根据另一个集合的字段值对查询结果进行排序,

问题:我想先获取用户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}
}
}

最佳答案

根据您从您的用户那里检索到的信息,您基本上想要公开 aggregation framework看起来像这样的查询:

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);

这就是它的全部。现在您有一些代码可以遍历用户的“ friend ”列表并构建另一个查询以获取这些 friend 的所有帖子,这些帖子由每个 friend 的“强度”值加权。

当然,您可以通过删除或更改 $match 对所有帖子的查询做很多相同的事情,但保持“重量”投影您可以将所有“ friend ”帖子“ float ”到顶部。

关于javascript - 如何按加权值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25682678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com