我一直在网上寻找可能的解决方案,但是我所能找到的只是在数组中寻找值。我的帖子集合中有一个名为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']
不确定采用哪种方法以及获得的任何帮助将不胜感激
答案 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。