Mongoose / MongoDB Получить наиболее часто просматриваемые статьи, сгруппированные в течение дня - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь клонировать API-интерфейс сообщества, похожего на Reddit, используя MongoDB + Mon goose на Node.js.

Мой пример JSON данных выглядит следующим образом:

            {
                "genre": "free",
                "viewCount": 90,
                "isDeleted": false,
                "commentCount": 0,
                "voteCount": 0,
                "_comments": [],
                "_vote": [],
                "_id": "ObjectId",
                "title": "blahblah",
                "contents": "blah",
                "createdAt": "2020-01-24T08:50:28.409Z",
                "__v": 0,
                "id": "5e2aafd4395bf593aa94b623"
            },

Чтобы решить эту проблему, я просто отсортировал, используя .sort({ viewCount:-1, createdAt: -1 }).

Однако, когда я сортировал таким образом, самое последнее созданное сообщение всегда будет первым, даже если другие сообщения имеют больший размер viewCount значения ...

Следующая вещь, о которой я думаю, - попытка сгруппировать данные постов по дням (т.е. все созданные сегодня сообщения сгруппированы; все созданные вчера сообщения сгруппированы вместе).

После группировки, возможно, я смогу отсортировать остальные данные по viewCount.

Я полагаю, что метод с использованием aggregate был бы единственным возможным решением, но я хотел бы знать, будет ли самое простое и лучшее решение для этой проблемы!

Вывод Я хотел бы получить что-то вроде этого:

// viewcount in Descending Order
{ '2020-01-24': 
{ post1: { viewcount: 999, contents: ...}, 
{ post2: { viewcount: 998, contents:... }, 
... } }, 
'2020-01-23':  
{ post1: { viewcount: 999, contents: ...}, 
{ post2: { viewcount: 998, contents:... }, 
... }, 
'2020-01-22':  
{ post1: { viewcount: 999, contents: ...}, 
{ post2: { viewcount: 998, contents:... }, 
... }, ...}

Пожалуйста, помогите мне здесь ...

Спасибо:)

1 Ответ

1 голос
/ 24 января 2020

Эта агрегация дает нечто похожее на ожидаемый результат:

db.test.aggregate( [ 
  { $sort: { createdAt: -1, viewCount: -1} },
  { $group: { _id: "$createdAt", post: { $push: "$$ROOT" } } },
  { $project: { post: 1, date: "$_id", _id: 0 } }
] )
...