检查是否可以在字段中找到数组中的至少一个单词

时间:2018-11-12 14:27:58

标签: php mongodb laravel nosql

我一直在网上寻找可能的解决方案,但是我所能找到的只是在数组中寻找值。我的帖子集合中有一个名为summary的字段,其中包含特定帖子的段落摘要。我也有一系列单词,我想检查一下摘要中是否至少有一个单词,但是我不确定该怎么做。我正在使用一个名为lensegegers的laravel软件包进行查询,因此寻找有关如何正确执行聚合查询的资源非常有限。我想返回其摘要至少包含要发送的数组中的一个单词的所有帖子。这有可能吗?

这是我的查询

$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']

之类的Inters数组组成。

不确定采用哪种方法以及获得的任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

我建议将正则表达式与laravel结合使用,如下所示:

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

在这里,正则表达式将产生.*(magic|swords|legion).*,它将使其中任何一个与任一侧都匹配

答案 1 :(得分:1)

您可以使用$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选项使其不区分大小写。

如果您要进行大量的文本搜索,则可能需要查看collations