Проверьте, является ли поле подстрокой более длинной строки с MongoDB - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь найти способ вернуть документ, основанный на том, является ли поле подстрокой данной строки.

Я получил работающий прототип, который в основном выбирает все из коллекции, а затем выполняет необходимую логику в коде. В коде я могу найти то, что хочу, перебирая каждый документ, а затем возвращая документ, основанный на search.includes(field). Это, очевидно, не идеальное решение, поскольку получение каждого документа в коллекции - это дорогостоящая операция, которая плохо масштабируется.

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

Можно ли как-нибудь создать запрос, который проверяет, является ли поле документа точной подстрокой данной строки?

Например, вот три документа, похожих на те, что есть в моей коллекции:

{
    "_id": ObjectId("5b893f36e7e6ab1a88f87b39"),
    "trigger": "hello",
    "response": "World"
}

{
    "_id": ObjectId("5b6ca6169cc009573bbc3571"),
    "trigger": "stackoverflow",
    "response": "Is awesome!"
}

{
    "_id": ObjectId("5b6ca6169cc009573bbc3571"),
    "trigger": "foo bar",
    "response": "barfoo"
}

Вот некоторые случаи с ожидаемым результатом:

Строки поиска stack или stackexchange не должны возвращать никаких документов, так как нет триггерного поля, которое является идеальной подстрокой для них.

Строка hello stackexchange должна получить только первый документ, поскольку поле триггера является подстрокой строки поиска.

Строка hello stackoverflow выдаст вам оба документа, поскольку у них обоих есть поле триггера, которое является подстрокой строки поиска.

РЕДАКТИРОВАТЬ: Запрос также должен учитывать тот факт, что поле триггера может содержать пробелы. Поэтому строка foo bar foobar должна соответствовать последнему документу, а строка foo не должна.

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 01 сентября 2018

После долгих проб и ошибок я нашел способ добиться того, чего хотел. Используя $indexOfBytes в $gt, я смог проверить, существует ли триггер в качестве подстроки в строке поиска, увидев, был ли результат $indexOfBytes больше -1. Вот мой последний запрос Mongoose:

Collection.find({
    $expr: {
        $gt: [
            {
                $indexOfBytes: [
                    search,
                    "$trigger"
                ]
            },
            -1
        ]
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...