Как получить длину результатов find () с помощью запроса MongoDB Driver в PHP?

#php #mongodb

#php #mongodb

Вопрос:

У меня есть сервер MongoDB с коллекцией, насчитывающей сотни тысяч документов.

Мне нужно получить только количество документов, соответствующих условию фильтра запроса, используя MongoDB Driver в PHP.

В mongo-shell я бы просто сделал следующее:

 db.samples.find({"location": {$geoWithin: {$geometry: ...reference_polygon... }}}).length
  

Приведенный ниже запрос в PHP вернет курсор с полным списком документов (это могут быть тысячи документов), которые мне не нужны, я ищу только количество выборок в пределах указанного полигона:

 $query = new MongoDBDriverQuery( 
    ["location" => ['$geoWithin' => ['$geometry' => $reference_polygon]]],
    []
);
$cursor = $dbm->executeQuery("test.samples", $query);
  

Даже уменьшение проекции для возврата одного поля _id значительно увеличило бы время вычисления.

Есть ли какой-нибудь способ получить только скалярное количество документов и избежать загрузки результатов с курсором, а затем подсчитывать их подобным count($cursor->toArray()) образом?

Сервер MongoDB: 4.4.1 Версия PHP: 7.4 ОС: Ubuntu 20.04 LTS

Ответ №1:

Итак, наконец, я нашел способ сделать это с помощью MongoDBDriverCommand .

Код приведен ниже, у кого-нибудь есть лучшее предложение, пожалуйста, не стесняйтесь комментировать.

 $database_name = "test";
$collection_name = "samples";
$query = new MongoDBDriverQuery( 
    ["location" => ['$geoWithin' => ['$geometry' => $reference_polygon]]],
    []
);
$dbc = new MongoDBDriverCommand(
    ['count' => $collection_name, "query" => (object)$query]
);
$cursor = $dbm->executeCommand($database_name, $dbc);
$n = (isset($cursor->toArray()[0]->n)) ? $cursor->toArray()[0]->n : 0;