У меня есть 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 полей.
Есть ли способ повысить производительностьпри работе с этими вложенными объектами?