Ну, вы всегда можете построить индекс по убыванию для поля scores
и использовать ограничение.
Сортировка по убыванию и ограничение до 10 выполнят свою работу.
В примере ниже представлена коллекция из 1 миллиона документов, каждый из которых имеет поле score
.
'use strict';
const mongoose = require('mongoose');
const { Schema } = mongoose;
run().catch(console.error);
async function run () {
await mongoose.connect('mongodb://localhost:27017/test', {
useNewUrlParser: true,
useUnifiedTopology: true
});
await mongoose.connection.dropDatabase();
const userSchema = new Schema({
score: Number
});
const User = mongoose.model('User', userSchema);
const users = Array.from({ length: 1000 * 1000 }).map((v, i) => ({ score: i + 1 }));
await User.init();
await User.insertMany(users);
const before = Date.now();
await User.find().sort({ score: -1 }).limit(10);
const after = Date.now();
console.log(`Query took: ${after - before}ms.`);
}
Без индекса в поле score
вывод будет:
Query took: 1468ms.
С индекс по убыванию :
Query took: 9ms.
Вот как вы можете создать индекс в mon goose.