Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何按加权值排序_Javascript_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript 如何按加权值排序

Javascript 如何按加权值排序,javascript,mongodb,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongodb Query,Aggregation Framework,我有一个问题,我想根据另一个集合中的字段值对查询结果进行排序 问题:我想先获取用户123个好友,然后获取他们的帖子,然后使用好友强度值对帖子进行排序 我有这个: POST COLLECTON: { user_id: 8976, post_text: 'example working', } { user_id: 673, post_text: 'something', } USER COLLECTON: { user_id: 123, frien

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

问题:我想先获取用户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”:[6738976]}},
{“$project”:{
“用户id”:1,
“后文本”:1,
“重量”:{
“$cond”:[
{“$eq”:[“$user_id”,8976]},
1.
{“$cond”:[
{“$eq”:[“$user_id”,673]},
4.
0
]}
]
}
}},
{“$sort”:{“weight”:-1}
])
那么,为什么要在不进行聚合的情况下进行聚合呢?正如您所看到的,聚合框架不仅仅是聚合。在这里,它用于将一个新字段“投影”到文档中,并使用“权重”填充该字段以进行排序。这允许您按照希望排序的值重新排序结果

当然,您需要以“生成”的方式从初始数据获取此表单,就像您对任何数据所做的那样。这需要几个步骤,但在这里我将介绍JavaScript方法,它应该很容易转换为大多数语言

另外,假设您的实际“用户”看起来更像这样,这是有效的:

{
“用户id”:123,
“朋友”:[
{“用户id”:673,“强度”:4},
{“用户id”:8976,“强度”:1}
]
}
然后从这样的对象构造聚合管道:

//用户是上面显示的结构
var堆栈=[];
args=[];
user.friends.forEach(函数(friend){
args.push(friend.user\u id);
var rec={
“$cond”:[
{“$eq”:[“user_id”,friend.user_id]},
朋友,力量
]
};
if(stack.length==0){
记录[“$cond”].推送(0);
}否则{
var last=stack.pop();
记录[“$cond”].推送(最后一次);
}
堆栈推送(rec);
});
变量管道=[
{“$match”:{“user_id”:{“$in”:args}},
{“$project”:{
“用户id”:1,
“后文本”:1,
“重量”:堆栈[0]
}},
{“$sort”:{“weight”:-1}
];
db.桩.骨料(管道);
这就是全部。现在,您有了一些代码来遍历用户的“朋友”列表,并构造另一个查询,以获得这些朋友的所有帖子,并根据每个帖子的“强度”值进行加权


当然,你可以通过删除或更改
$match
来查询所有帖子,但保持“权重”投影,你可以将所有“朋友”帖子“浮动”到顶部。

谢谢你的回答,这是我想要的,但有一个问题,此方法是否经过优化且速度足够快,可以同时用于多个用户?@Kordkandi此处的实际处理与使用投影字段和
.sort()
的任何
.find()
操作没有太大区别,其额外优点是能够计算字段,否则使用
.find()
是不可能的。数据库服务器应该比你的应用服务器快,你也可以在服务器上限制和分页结果。如果每个用户有超过500个“freinds”,那么无论如何都不应该使用数组,可以选择并行查询。但是这是相当快的,不管它看起来有多复杂,有20个或更多的朋友谢谢,你是我日常问题的答案;)