агрегация mongodb $группирует $ сортировку

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

У меня есть звездообразная схема, подобная этой:

 Schema = mongoose.Schema
  user:
    type: mongoose.Schema.Types.ObjectId
    ref: "User"
  mod:
    type: mongoose.Schema.Types.ObjectId
    ref: "Mod"
  time_bucket:
    raw: Date
    hour: String
    day: String
    week: String
    month: String
    quarter: String
    year: String   

Schema.virtual("date").get () ->
  return time_bucket[0].raw
.set (date) ->
  date = new Date date
  @time_bucket =
    raw:      date
    hour:     "#{date.getFullYear()}-#{date.getMonth()}-#{date.getDate()}-#{date.getHours()}"
    day:      "#{date.getFullYear()}-#{date.getMonth()}-#{date.getDate()}"
    week:     "#{date.getFullYear()}-#{date.getMonth()}-#{date.getWeek()}"
    month:    "#{date.getFullYear()}-#{date.getMonth()}"
    quarter:  "#{date.getFullYear()}-#{date.getQuarter()}"
    year:     "#{date.getFullYear()}"
  

Поле mod соответствует моду, у которого может быть много звездочек.

Я пытаюсь получить трендовые моды, подобные этому:

 Star.aggregate [
    {
      $limit : 6
    }
    {
      $match:
        "time_bucket.month": "#{date.getFullYear()}-#{date.getMonth()}"
    }
    {
      $group:
        _id: "$mod"
        stars:
          "$sum": 1
    }
    {
      $sort : {
        "stars": -1
        }
    }

  ], (err, docs) ->
    Star.populate docs,
      path: "_id",
      model: "Mod",
      select: "slug name summary author created lastUpdated"
    , (err, docs) ->
      data.trendingMods = docs
  

Но это не работает. Я могу получить количество звезд за неделю для 6 модов, но я не могу их отсортировать : (. Как отсортировать их, чтобы получить моды, у которых больше звездочек, чем у других?

Комментарии:

1. Не уверен, в чем здесь ваша проблема. У вас есть $limit в начале конвейера. Если вы хотите получить результаты за весь месяц, то это должен быть «последний» шаг.

Ответ №1:

Как @NeilLunn, $limit это было в начале, тогда как должно было быть после $group :

   Star.aggregate [
    {
      $match:
        "time_bucket.month": "#{date.getFullYear()}-#{date.getMonth()}"
    }
    {
      $group:
        _id: "$mod"
        stars:
          "$sum": 1
    }
    {
      $limit : 6
    }
    {
      $sort : {
        "stars": -1
        }
    }

  ], (err, docs) ->
  

Спасибо!