Требуется ли вложенным объектам много производительности для проецирования, фильтрации и сортировки? - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть database с 50 миллионами документов, и у каждого документа есть поле object, в котором находятся десятки других вложенных объектов. В основном это поле является XML файлом, преобразованным в object. Я проводил некоторые тесты с aggregate() и find(), но заметил, что проецирование и фильтрация этого поля значительно снижают производительность. Например,

$cursor = $db->find(array(
            'id_empresa' => 7,
            'tipo_doc' => 'nfe',
            'xml.NFe.infNFe.emit.xNome' => ['$regex' => 'auto', '$options' => 'i'],
            '$and' => array(['$or' => array(
                        ['xml.NFe.infNFe.emit.xNome' => ['$regex' => 'me', '$options' => 'i']],
                        ['xml.NFe.infNFe.dest.xNome' => ['$regex' => 'me', '$options' => 'i']],
                        ['xml.NFe.infNFe.transp.transporta.xNome' => ['$regex' => 'me', '$options' => 'i']]
                    )])
                ), array(
            'limit' => 100,
            'sort' => ['xml.NFe.infNFe.emit.xNome' => 1],
            'projection' => array(
                'id_empresa' => 1,
                'tipo_doc' => 1,
                '_id' => 1,
                'xml.NFe.infNFe.emit.xNome' => 1,
                'xml.NFe.infNFe.ide.nNF' => 1,
                'xml.NFe.infNFe.dest.xNome' => 1,
                'xml.NFe.infNFe.transp.transporta.xNome' => 1,
            )
        ));

В этом примере есть только 4 спроецированных поля этого объекта, но в большинстве случаев это будет около 20 ~ 40 полей.

Есть ли способ повысить производительностьпри работе с этими вложенными объектами?

...