Я не знаю, почему никто пока не упоминает 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
Плюсы этого решения:
Вы можете использовать оператор запроса $regex
для проверки каждого отдельного регулярного выражения. Вы можете сделать перекрестную ссылку на результаты через запись code
, чтобы увидеть, есть ли она в нескольких результатах:
const regexes = [
/AA*AFO/,
...
];
const results = {};
regexes.forEach(async (regex) => {
results[regex] = await db.collection.find(
{
code: {
$regex: regex
}
});
});
Во-первых, построение этого запроса как регулярного выражения для строки будет одним из наименее эффективных способов запроса. Вместо этого вам следует выполнять запросы по фактическим полям:
{
$or: [
{prefix: "AA", numbers: "02", "letters": "AFO"}, -- full match
{prefix: {$exists: true}, numbers: "02", "letters: "AFO" } -- varying prefix,
...etc
]}
Запросы по фактическим полям позволят Mongo эффективно использовать индексы. Регулярное выражение типа /^..02AFO/
потребует проверки каждой записи в индексе на совпадения.
В настоящее время у меня есть индекс для всех полей, кроме цены, и индекс для конкатенированного кода. Есть ли способ гарантировать, что запрос выдаст разные результаты, если строка соответствует нескольким регулярным выражениям?
blockquote>Если вы хотите сопоставить регулярные выражения, вы можете использовать
$in
[116 ] объединить несколько регулярных выражений & amp; вернуть только уникальные подходящие документы:{code: {$in: [/foo/, /bar/] }
Вы также можете использовать
$or
:{$or: [{code: /foo/}, {code: /bar/}], otherCriterion: "yay"}
.
Я бы ответил на вопрос Уиллиса и предложил бы вам точно сопоставить каждый из компонентов строки. Однако, если это не достаточно гибко (то есть вы хотите иметь возможность выполнять частичное совпадение в пределах каждого компонента), я бы рекомендовал настроить зеркальный механизм ElasticSearch, особенно учитывая, сколько у вас записей. MongoDB на самом деле не предназначен для эффективного поиска текста произвольной формы.
Мой личный опыт заключался в том, что при примерно 10 миллионах записей, даже при индексировании объединенного строкового поля, поиск в произвольной форме занимал> 30 секунд на запрос, даже при достаточном объеме ОЗУ для хранения (довольно большого) индекса. Поскольку я пытался выполнить автозаполнение в реальном времени для текстового поля, это не сработало бы: -)
ElasticSearch имеет несколько решений для автоматической репликации данных из mongodb в его собственную базу данных, поэтому я обнаружил, что после установки все прошло, все прошло довольно гладко. Я использую monstache ( https://github.com/rwynn/monstache ), но есть и другие. Я понимаю, что это не совсем то, о чем вы просили, но я прошел через мучительный процесс, пытаясь оптимизировать mongodb для поиска текста произвольной формы, который не длился вечно и в конечном итоге сдался. Если это будет общий запрос и вам нужна приличная производительность, я настоятельно рекомендую рассмотреть что-то вроде ElasticSearch, которое оптимизировано для него.