JavaScript: Разработка поискового запроса для MongoDB - PullRequest
0 голосов
/ 24 февраля 2019

Мне нужна помощь в разработке поискового запроса, чтобы дать кнопке в моем приложении Electron некоторую функциональность.

Вот как далеко я продвинулся:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  Artist.sort()
    .find()
    .offset()
    .limit();
};

Я пропускаю criteria пока не стесняйтесь игнорировать это.Пользователь должен иметь возможность сортировать по имени исполнителя, возрасту и выпущенным альбомам.sortProperty будет идти в порядке возрастания, поэтому я знаю, что мне нужно отсортировать по значению 1.

Реальная проблема, стоящая за сортировкой, заключается в том, что мне нужно указать другой sortProperties, но только один вв любой момент времени.

Я хочу иметь возможность передавать другое значение sortProperty в зависимости от того, что выбрал пользователь.Я хотел бы иметь ключ, который равен sortProperty.

Поэтому, если sortProperty равен возрасту, я должен убедиться, что у меня есть утверждение, в котором говорится о возрасте.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Таким образом, приведенный выше ответ является лучшим решением, поскольку он является ES6 и более элегантным.Я хотел рассказать о старом школьном образе ES5, который я изучил после того, как получил этот ответ, и изучил его более подробно.

Я понял, что в ES5 вы можете определить объект следующим образом:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  const sortOrder = {};

  Artist.find({})
    .sort()
    .skip(offset)
    .limit(limit);
};

Я сделал его пустым объектом, а затем посмотрел на него и добавил sortProperty равно 1 примерно так:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  const sortOrder = {};
  sortOrder[sortProperty] = 1;

  Artist.find({})
    .sort()
    .skip(offset)
    .limit(limit);
};

И тогда я могу передать sortOrder примерно так:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  const sortOrder = {};
  sortOrder[sortProperty] = 1;

  Artist.find({})
    .sort(sortOrder)
    .skip(offset)
    .limit(limit);
};

Хорошо, таков подход ES5, если кто-то заинтересован в его изучении, но, как вы можете видеть выше, решение ES6 выглядит лучше.

Вся проблема с созданиемобъект и одновременное добавление к нему свойства заключается в том, что он плохо поддерживается в ES5, мы должны сначала объявить объект, затем добавить к нему свойство и установить это свойство равным 1.

Квадратные скобки означают внешний видв переменной sortProperty:

sortOrder[sortProperty] = 1;

, которая является строкой, и я пытаюсь добавить к этому объекту sortOrder свойство name и установить его равным 1, и поэтомуконечный результат, если вы запустили это в консоли Chrome или яФрагмент кода n: { name: 1 }.

Кривая обучения для меня и то, что выбранный ответ помог мне узнать, были интерполированные свойства или ключи ES6.Эта вещь:

.sort({ [sortProperty]: 1 })

То, что происходит здесь, это то, что во время выполнения посмотрите на переменную sortProperty и независимо от того, что она равна, добавьте это свойство к этому объекту и присвойте ему значение 1.

Итак, чтобы быть ясным, да, первоначальный ответ был элегантным решением, с которым я пошел:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  Artist.find()
    .sort({ [sortProperty]: 1 })
    .skip(offset)
    .limit(limit);
};

Я просто поделился тем, что узнал в процессе изучения и реализации.

0 голосов
/ 24 февраля 2019

Кажется, у вас уже есть все необходимые части для выполнения запроса.Вам просто нужно создать селектор sort на основе вашего sortProperty.Это будет объект с ключом, равным значению sortProperty, например age.Результат будет выглядеть следующим образом:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  return Artist
    .find()
    .sort({ [sortProperty]: 1 })
    .skip(offset)
    .limit(limit);
};

Примечание

Для иллюстрации назначения динамических клавиш приведен фрагмент

const sortProperty = 'age';
const selector = { [sortProperty]: 1 };

console.log(selector);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...