Эффективность предлагаемого ответа в порядке. Согласно документации MongoDB :
Когда $ sort сразу предшествует $ limit , оптимизатор может объединить $ limit в $ Сортировать. Это позволяет операции сортировки поддерживать только верхние n результатов по мере их продвижения, где n является указанным пределом, а MongoDB нужно хранить только n элементов в памяти.
Таким образом, в случае
db.collection.find().sort({age:-1}).limit(1)
мы получаем только самый высокий элемент БЕЗ сортировки коллекции из-за упомянутой оптимизации.
Хотя прокси-сервер будет работать, он также будет работать довольно медленно. Различный подход будет для каждого метода, который должен использовать значение _determinant
, сначала пройти через различную функцию , чтобы проверить, нужно ли обновить _determinant
(и если да, то обновить ). Таким образом, дорогостоящий пересчет выполняется не каждый раз, когда изменяется массив, а только вовремя для использования результата. Например:
class Matrix extends Array {
constructor() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
if (Array.isArray(arguments[i])) {
args.push(new Matrix(...arguments[i]));
} else {
args.push(arguments[i]);
}
}
super(...args);
this._determinant = null;
}
// next method is effectively a recursive deep join
// could also use toString if it doesn't interfere with anything else
getString() {
const itemsStr = this.map((item) => (
item instanceof Matrix
? item.getString()
: item
))
.join(',');
const result = '[' + itemsStr + ']';
return result;
}
getDeterm() {
const newString = this.getString();
if (newString !== this._lastString) {
this._lastString = newString;
this.upperEchelon();
}
return this._determinant;
}
upperEchelon() {
console.log('running upperEchelon');
this._determinant = Math.random();
}
}
const m = new Matrix([2, 3, 4], 5);
console.log(m.getDeterm());
// Not calculated again:
console.log(m.getDeterm());
// Mutation, next call of getDeterm will run upperEchelon:
m[0][0] = 1;
console.log(m.getDeterm());