所以首先这是我要做的事情:
我有一个带有一些自定义输入的数据表。用户可以选择技能(php,mysql等)和标准文本输入。用户可以选择多种技能。当选择了多个技能时,它应该是一种AND AND查询。因此这两种技能都必须具备。
在数据表中输入的标准文本将包含诸如客户名称,其电子邮件或职务等信息。
例如,我检查PHP和Javascript,在文本搜索中放入Google。 这意味着我正在寻找一个文档,该文档的标签中包含PHP和Javascript(或它们的任何别名,例如:Javascript => js),并且在列出的其他任何字段(客户,函数,发件人姓名,发件人电子邮件或主题)。
但是它也应该能够搜索与技能匹配的文档或仅用于文本输入的文档。
我一直在尝试使用所有查询选项构建数组,并根据函数的输入合并它们,但到目前为止没有任何效果。
匹配过滤器必须是对象中的表达式
下面是我在Mongo中获得的文档的示例
{
"_id": {
"$oid": "superfancyID"
},
"parsed": {
"tags": [
"sql",
"php"
],
"customer": "CustomerName",
"function": "functionName",
"mail_properties": {
"senderName": "SenderName",
"senderEmail": "example@example.com",
"subject": "FW: Test email",
}
}
}
这是我必须尝试构建查询的一些代码
public function handler(int $skip, int $limit, array $filters, string $filterString = '') {
# $filters are skills
# $filterString is a string of everything else you put in the search field of the datatable
/** @var \MongoDB\Collection $collection */
$collection = $this->emailRepository->getCollection();
/** @var array $regex */
$regex = [];
if(!empty($filterString))
{
$strings = explode(' ', $filterString);
foreach($strings as $item)
{
$regex[] = new Regex($item, 'i');
}
}
#This function basically does the same as above.
#The only change is that this also goes over any aliases for skills. (Javascript => js)
/** @var array $aliasRegex */
$aliasRegex = $this->createAliasRegex($filters);
$skillsFilters = [];
#This is where I attempt to create a part of the query for just the skills.
if(!empty($aliasRegex)) {
$skillsFilters = [
'$and' => [
'$or' => [
['parsed.tags' => [
'$in' => $aliasRegex
]]
]
]
];
}
$stringFilters = [];
#This is where I try and build the rest of the query.
if(!empty($regex)) {
$stringFilters = ['$or' =>
['parsed.function' => [
'$in' => $regex
]],
['parsed.mail_properties.subject' => [
'$in' => $regex
]],
['parsed.customer' => [
'$in' => $regex
]]
];
}
$documents = $collection->aggregate([
[
'$match' => [
array_merge($stringFilters, $aliasFilters)
]
]
,[
'$limit' => $limit,
],[
'$skip' => $skip
]
]);
这基本上就是我所得到的,我尝试检查数组并移动某些部分,但是没有任何效果。我一直都在找回错误
匹配过滤器必须是对象中的表达式