#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;