Мне нужно, чтобы конвейер соответствовал документам, где поле «modelName» равно «movies» или «tv_shows». Я попробовал приведенный ниже код, но он соответствует только «tv_shows» и игнорирует «фильмы».
$match = array('$match' => array('modelName' => 'movies', 'modelName' => 'tv_shows'));
Весь сценарий:
<?php
$connection = new MongoClient;
$collection = $connection -> selectDB("getglue") -> selectCollection("gg");
MongoCursor::$timeout = -1;
$match = array('$match' => array('modelName' => 'movies', 'modelName' => 'tv_shows'));
$group = array('$group' => array('_id' => '$title', 'total' => array('$sum' => 1)));
$sort = array('$sort' => array('total' => -1));
$limit = array('$limit' => 7);
$pipeline = array($match, $group, $sort, $limit);
$out = $collection -> aggregate($pipeline);
echo json_encode($out, JSON_PRETTY_PRINT);
?>
Использовать $or
оператор:
$match = array('$match' =>
array('$or' => array(array("modelName" => "movies"),
array("modelName" => "tv_shows"))
)
);
array
в PHP на самом деле ordered map
, Карта может иметь только одно значение для любого ключа, и последнее добавленное значение переопределит все предыдущие значения для того же ключа. Итак, ниже tv_shows
который является последним добавленным значением для ключа — modelName
будет связано как единственное значение ключа. И именно поэтому вы получаете результаты только для modelname
из tv_shows
,
'$match' => array('modelName' => 'movies', 'modelName' => 'tv_shows')
Других решений пока нет …