Nano Hash - криптовалюты, майнинг, программирование

Запрос совокупного соответствия Mongodb с приоритетом полного совпадения

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

Например, если у меня есть база данных, полная следующих записей.

{
   "username": "patrick"
},
{
   "username": "robert"
},
{
   "username": "patrice"
},
{
   "username": "pat"
},
{
   "username": "patter"
},
{
   "username": "john_patrick"
}

И я запрашиваю имя пользователя «pat». Я хотел бы получить результаты с прямым соответствием сначала, а затем частичными. Таким образом, результаты будут упорядочены ['pat', 'patrick', 'patrice', 'patter', 'john_patrick'].

Можно ли сделать это только с помощью запроса mongo? Если да, может ли кто-нибудь указать мне на ресурс, подробно описывающий, как это сделать?

Вот запрос, который я пытаюсь использовать для этого.

db.accounts.aggregate({ $match : 
{ 
    $or : [ 
        { "usernameLowercase" : "pat" },
        { "usernameLowercase" : { $regex : "pat" } }
    ] 
} })
07.08.2018


Ответы:


1

Учитывая ваш точный пример, это можно сделать следующим образом - если ваш реальный сценарий немного сложнее, вы можете столкнуться с проблемами:

db.accounts.aggregate([{
    $match: {
        "username": /pat/i // find all documents that somehow match "pat" in a case-insensitive fashion
    }
}, {
    $addFields: {
        "exact": { 
            $eq: [ "$username", "pat" ] // add a field that indicates if a document matches exactly
        },
        "startswith": { 
            $eq: [ { $substr: [ "$username", 0, 3 ] }, "pat" ] // add a field that indicates if a document matches at the start
        }

    }
}, {
    $sort: {
        "exact": -1, // sort by our primary temporary field
        "startswith": -1 // sort by our seconday temporary
    }
}, {
    $project: {
        "exact": 0, // get rid of the "exact" field,
        "startswith": 0 // same for "startswith"
    }
}])

Другой способ - использовать $facet, который может оказаться немного более мощным за счет включения более сложных сценариев, но медленнее (хотя некоторые люди здесь меня возненавидят за это предложение):

db.accounts.aggregate([{
    $facet: { // run two pipelines against all documents
        "exact": [{ // this one will capture all exact matches
            $match: {
                "username": "pat"
            }
        }],
        "others": [{ // this one will capture all others
            $match: {
                "username": { $ne: "pat", $regex: /pat/i }
            }
        }]
    }
}, {
    $project: {
        "result": { // merge the two arrays
            $concatArrays: [ "$exact", "$others" ]
        }
    }
}, {
    $unwind: "$result" // flatten the resulting array into separate documents
}, {
    $replaceRoot: { // restore the original document structure
        "newRoot": "$result"
    }
}])
07.08.2018
  • Это именно то, что я искал, большое спасибо dnickless. 08.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..