mongodb - эффективный способ поиска строк

Я не знаю, почему никто пока не упоминает Carbon.

https://github.com/briannesbitt/Carbon

Это на самом деле расширение до php dateTime (которое уже использовалось здесь), и оно имеет метод diffforHumans. Итак, все, что вам нужно сделать, это:

$dt = Carbon::parse('2012-9-5 23:26:11.123789');
echo $dt->diffForHumans();

еще примеры: http://carbon.nesbot.com/docs/#api-humandiff

Плюсы этого решения:

  • он работает для будущих дат и вернет что-то вроде через 2 месяца и т. Д.
  • вы можете использовать локализацию для получения других языков и работы по плюрализации fine
  • , если вы начнете использовать Carbon для других вещей, работающих с датами, будет так же просто, как никогда.

1
задан berimbolo 11 March 2019 в 14:17
поделиться

3 ответа

Вы можете использовать оператор запроса $regex для проверки каждого отдельного регулярного выражения. Вы можете сделать перекрестную ссылку на результаты через запись code, чтобы увидеть, есть ли она в нескольких результатах:

const regexes = [
  /AA*AFO/,
   ...
];

const results = {};

regexes.forEach(async (regex) => {
  results[regex] = await db.collection.find(
    {
      code: {
        $regex: regex
       }
    });
});
0
ответ дан jakemingolla 11 March 2019 в 14:17
поделиться

Во-первых, построение этого запроса как регулярного выражения для строки будет одним из наименее эффективных способов запроса. Вместо этого вам следует выполнять запросы по фактическим полям:

{
$or: [
  {prefix: "AA", numbers: "02", "letters": "AFO"}, -- full match
  {prefix: {$exists: true}, numbers: "02", "letters: "AFO" } -- varying prefix,
   ...etc
]}

Запросы по фактическим полям позволят Mongo эффективно использовать индексы. Регулярное выражение типа /^..02AFO/ потребует проверки каждой записи в индексе на совпадения.

В настоящее время у меня есть индекс для всех полей, кроме цены, и индекс для конкатенированного кода. Есть ли способ гарантировать, что запрос выдаст разные результаты, если строка соответствует нескольким регулярным выражениям?

Если вы хотите сопоставить регулярные выражения, вы можете использовать $in [116 ] объединить несколько регулярных выражений & amp; вернуть только уникальные подходящие документы: {code: {$in: [/foo/, /bar/] }

Вы также можете использовать $or : {$or: [{code: /foo/}, {code: /bar/}], otherCriterion: "yay"}.

0
ответ дан willis 11 March 2019 в 14:17
поделиться

Я бы ответил на вопрос Уиллиса и предложил бы вам точно сопоставить каждый из компонентов строки. Однако, если это не достаточно гибко (то есть вы хотите иметь возможность выполнять частичное совпадение в пределах каждого компонента), я бы рекомендовал настроить зеркальный механизм ElasticSearch, особенно учитывая, сколько у вас записей. MongoDB на самом деле не предназначен для эффективного поиска текста произвольной формы.

Мой личный опыт заключался в том, что при примерно 10 миллионах записей, даже при индексировании объединенного строкового поля, поиск в произвольной форме занимал> 30 секунд на запрос, даже при достаточном объеме ОЗУ для хранения (довольно большого) индекса. Поскольку я пытался выполнить автозаполнение в реальном времени для текстового поля, это не сработало бы: -)

ElasticSearch имеет несколько решений для автоматической репликации данных из mongodb в его собственную базу данных, поэтому я обнаружил, что после установки все прошло, все прошло довольно гладко. Я использую monstache ( https://github.com/rwynn/monstache ), но есть и другие. Я понимаю, что это не совсем то, о чем вы просили, но я прошел через мучительный процесс, пытаясь оптимизировать mongodb для поиска текста произвольной формы, который не длился вечно и в конечном итоге сдался. Если это будет общий запрос и вам нужна приличная производительность, я настоятельно рекомендую рассмотреть что-то вроде ElasticSearch, которое оптимизировано для него.

0
ответ дан Hashcut 11 March 2019 в 14:17
поделиться
Другие вопросы по тегам:

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