mongodb — агрегация монго в PHP: совпадение нескольких значений в одном поле

Мне нужно, чтобы конвейер соответствовал документам, где поле «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);

?>

1

Решение

Использовать $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')
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]