Проверьте, можно ли найти хотя бы одно слово из массива в поле - PullRequest
0 голосов
/ 12 ноября 2018

Я искал в Интернете возможное решение этой проблемы, но все, что я могу найти, - это поиск значений в массиве. В моих коллекциях сообщений есть поле summary, в котором содержится сводка абзаца определенного сообщения. У меня также есть массив слов, и я хотел бы проверить, присутствует ли хотя бы одно из этих слов в резюме, но я не уверен, как это сделать. Я использую пакет для laravel под названием jenssegers, чтобы сделать свои запросы, поэтому поиск ресурсов о том, как правильно выполнять агрегированные запросы, очень ограничен. Я хотел бы возвращать каждое сообщение, чье резюме содержит хотя бы одно слово из отправляемого массива. Это вообще возможно?

это мой запрос

$post = Post::raw(function ($collection) use ($request) {
        return $collection->aggregate(
            [
                [
                    '$elemMatch' => [
                        'summary' => $request->input('interests')
                    ],
                ],
                [
                    '$lookup' => [
                        'as' => 'edits',
                        'from' => 'editorial',
                        'foreignField' => '_id',
                        'localField' => 'edit_id',
                    ],
                ],
            ]
        );
    });

$request->input('interests') - это массив, отправляемый из моего интерфейса, который состоит из массива интересного типа ['magic','swords','legion']

Не уверен, какой подход к этому и любая помощь будет принята с благодарностью

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы можете использовать операторы $or и $regex для поиска внутри строковых полей:

db.posts.find({ "$or": [
    { "summary": { "$regex": "some" }, $options: 'i' }, 
    { "summary": { "$regex": "words" }, $options: 'i' }, 
    { "summary": { "$regex": "to" }, $options: 'i' }, 
    { "summary": { "$regex": "match" }, $options: 'i' }
]})

Опция i делает его нечувствительным к регистру.

Если вы делаете много текстового поиска, вы можете посмотреть сопоставления .

0 голосов
/ 12 ноября 2018

Я бы порекомендовал использовать регулярное выражение в сочетании с laravel, это будет выглядеть примерно так:

$searchTerms = ['magic','swords','legion'];
$regex = ".*(".implode("|", $searchTerms).").*"; 
YourModel::where("summary", "regexp", $regex)->get();

Здесь регулярное выражение будет выдавать .*(magic|swords|legion).*, что будет соответствовать любому из них с любым изсторона

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