#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) ->
Спасибо!