Лучшие документы на ведро - PullRequest
2 голосов
/ 09 июля 2019

Я хотел бы получить документы с наибольшим N field с для каждой из N категорий.Например, посты с 3 самыми высокими score с из каждого из последних 3 месяцев.Таким образом, каждый месяц будет иметь 3 сообщения, которые «выиграли» за этот месяц.


Вот то, что моя работа до сих пор получила, упростила.

// simplified
db.posts.aggregate([
  {$bucket: {
      groupBy: "$createdAt",
      boundaries: [
        ISODate('2019-06-01'),
        ISODate('2019-07-01'),
        ISODate('2019-08-01')
      ],
      default: "Other",
      output: {
        posts: {
          $push: {
            // ===
            // This gets all the posts, bucketed by month
            score: '$score',
            title: '$title'
            // ===
          }
        }
      }
    }},
  {$match: {_id: {$ne: "Other"}}}
])

Я попытался использовать$ slice оператор между // === с, но с ошибкой (ниже).

  postResults: {
    $each: [{
      score: '$score',
      title: '$title'
    }],
    $sort: {score: -1},
    $slice: 2
  }
An object representing an expression must have exactly one field: { $each: [ { score: \"$score\", title: \"$title\" } ], $sort: { baseScore: -1.0 }, $slice: 2.0 }

1 Ответ

1 голос
/ 09 июля 2019

$ slice , который вы пытаетесь использовать, предназначен для операций обновления.Чтобы получить топ N сообщений, вам нужно запустить $ unwind , затем $ sort и $ group , чтобы получить упорядоченный массив.В качестве последнего шага вы можете использовать $ slice (агрегат) , попробуйте:

db.posts.aggregate([
    {$bucket: {
        groupBy: "$createdAt",
        boundaries: [
            ISODate('2019-06-01'),
            ISODate('2019-07-08'),
            ISODate('2019-08-01')
        ],
        default: "Other",
        output: {
            posts: {
            $push: {            
                score: '$score',
                title: '$title'
            }
            }
        }
    }},
    { $match: {_id: {$ne: "Other"}}},
    { $unwind: "$posts" },
    { $sort: { "posts.score": -1 } },
    { $group: { _id: "$_id", posts: { $push: { "score": "$posts.score", "title": "$posts.title" } } } },
    { $project: { _id: 1, posts: { $slice: [ "$posts", 3 ] } } }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...