如何在MongoDB中获取朋友的排行榜

时间:2017-10-17 12:11:25

标签: node.js mongodb mongoose mongoose-schema

这是我的朋友收藏

[
    {
        "_id": "59e4fbcac23f38cdfa6963a8",
        "friend_id": "59e48f0af8c277d7a8886ed7",
        "user_id": "59e1d36ad17ad5ad3d0453f7",
        "__v": 0,
        "created_at": "2017-10-16T18:34:50.875Z"
    },
    {
        "_id": "59e5065f705a90cfa218c9e5",
        "friend_id": "59e48f0af8c277d7a8886edd",
        "user_id": "59e1d36ad17ad5ad3d0453f7",
        "__v": 0,
        "created_at": "2017-10-16T19:19:59.483Z"
    }
]

这是我的Scores系列:

[
    {
        "_id": "59e48f0af8c277d7a8886ed8",
        "score": 19,
        "user_id": "59e48f0af8c277d7a8886ed7",
        "created_at": "2017-10-13T09:02:10.010Z"
    },
    {
        "_id": "59e48f0af8c277d7a8886ed9",
        "score": 24,
        "user_id": "59e48f0af8c277d7a8886ed7",
        "created_at": "2017-10-11T00:56:10.010Z"
    },
    {
        "_id": "59e48f0af8c277d7a8886eda",
        "score": 52,
        "user_id": "59e48f0af8c277d7a8886ed7",
        "created_at": "2017-10-24T09:16:10.010Z"
    },
]

这是我的用户集合。

[
    {
        "_id": "59e48f0af8c277d7a8886ed7",
        "name": "testuser_0",
        "thumbnail": "path_0"
    },
    {
        "_id": "59e48f0af8c277d7a8886edd",
        "name": "testuser_1",
        "thumbnail": "path_1"
    },
    {
        "_id": "59e48f0af8c277d7a8886ee3",
        "name": "testuser_2",
        "thumbnail": "path_2"
    },
    {
        "_id": "59e48f0af8c277d7a8886ee9",
        "name": "testuser_3",
        "thumbnail": "path_3"
    },
]

最后,我需要以特定时间段(比如说最近24小时)按照高分排序排序的朋友列表... ...

[
{
"friend_id": "59e48f0af8c277d7a8886ed7",
"friend_name":"test_user_2"
"thumbnail":"image_path",
"highscore":15
},
"friend_id": "59e48f0af8c277d7a8886edd",
"friend_name":"test_user_3"
"thumbnail":"image_path",
"highscore":10
}
]

实现这一目标的最佳方法是什么?我已经尝试过聚合管道,但是对于使用3个集合感到非常困惑。

1 个答案:

答案 0 :(得分:0)

根据您的回答,文档中的500个条目的数组大小可能不是存储朋友的坏主意,因为您只在每个条目中存储“朋友ID”和“已创建”。它节省了一个集合。 如果通过仅选择所需的字段来在查询中投影数据,则不会出现太多性能问题。

https://docs.mongodb.com/v3.2/tutorial/project-fields-from-query-results/#return-specified-fields-only

每天增加30分;这取决于你做什么类型的查询。 通过每天添加30个分数,每个文档达到2MB限制需要一段时间。

关于加入不同的集合,有一个关于它的堆栈溢出问题:

How do I perform the SQL Join equivalent in MongoDB?

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

您需要使用mongoDB中的聚合框架来使用if;不只是一个查找命令。