Javascript обозреватель или прокси без каких-либо изменений, проходящих через прокси

Эффективность предлагаемого ответа в порядке. Согласно документации MongoDB :

Когда $ sort сразу предшествует $ limit , оптимизатор может объединить $ limit в $ Сортировать. Это позволяет операции сортировки поддерживать только верхние n результатов по мере их продвижения, где n является указанным пределом, а MongoDB нужно хранить только n элементов в памяти.

Таким образом, в случае

db.collection.find().sort({age:-1}).limit(1)

мы получаем только самый высокий элемент БЕЗ сортировки коллекции из-за упомянутой оптимизации.

0
задан lmhamilt 16 January 2019 в 02:24
поделиться

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());

0
ответ дан CertainPerformance 16 January 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: