匹配过滤器必须是PHP中mongo聚合的对象中的表达式

时间:2018-10-17 10:15:54

标签: php mongodb

所以首先这是我要做的事情:

我有一个带有一些自定义输入的数据表。用户可以选择技能(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
        ]
    ]);

这基本上就是我所得到的,我尝试检查数组并移动某些部分,但是没有任何效果。我一直都在找回错误

  

匹配过滤器必须是对象中的表达式

0 个答案:

没有答案