У нас есть документ для каждого пользователя. Мы награждаем их «апельсинами» (внутриигровыми очками) за выполнение активностей.
Мы сохраняем заданные точки следующим образом:
У нас есть свое эпохальное время вместе с заработанными апельсинами. В настоящее время у нас есть общая цель totalOranges
для создания постоянной таблицы лидеров.
Однако мы изо всех сил пытаемся определить, как составить таблицу лидеров за 24 часа и последние 7 дней. Мы можем рассчитать для каждого пользователя, но количество чтений будет безумным (более 10 тысяч пользователей). Есть ли более разумный способ сделать это?
или mongoplayground.net/p/EySSvXJjlUT где 604800000 представляет 7 дней в миллисекундах.
кстати, сделал вышеперечисленное
Да, спасибо!
прохладный! можешь написать ответ или написать в ЛМК, если хочешь, чтобы я
У меня был еще один запрос с той же структурой данных (на случай, если вы свободны): stackoverflow.com/questions/78933255/…. Спасибо!
Чтобы выполнить вычисления над объектом на основе динамических ключей, проще всего преобразовать объект в формат массива с помощью $objectToArray
, а затем обработать массив.
шаги, которые я использовал
$filter
массив, чтобы получить массив элементов, временная метка которых находится в пределах последних 7 (или n) дней. Теперь это входной массив для $reduce
$reduce
можно использовать для суммирования массива. сохраните сумму в отдельном полеdb.collection.aggregate([
{
$addFields: {
inbetweenTimePeriod: {
$reduce: {
input: {
$filter: {
input: { $objectToArray: "$sectional" },
as: "item",
cond: {
$gte: [
{ $toLong: "$$item.k" },
{
$divide: [ { $subtract: [ { $toLong: "$$NOW" }, 604800000 ] }, 1000 ]
//(epoch now in ms - 7days in ms) in seconds
}
]
}
}
},
initialValue: 0,
in: { $add: [ "$$value", "$$this.v" ] }
}
}
}
},
{ $sort: { inbetweenTimePeriod: -1 } }
])