У меня есть сборник документов MongoDB, содержащий несколько полей. Один из столбцов / полей должен быть только числовым, но некоторые из этих полей содержат нечисловые (поврежденные) данные в виде строковых значений. Я должен найти наивысшее числовое значение этого столбца, исключая коррумпированные, не численные данные. Мне известно о том, как получить максимальную ценность столбца в MongoDB , но AFAIK, этот расширенный случай не был рассмотрен.
Пример ниже показывает проблему. Для наивысшего значения должен быть возвращен документ с "age": 70
:
[ { "id": "aa001", "age": "90" }, { "id": "bb002", "age": 70 }, { "id": "cc003", "age": 20, } ]
Предоставление примера PHP для запроса find () / findOne () будет иметь большую помощь. Большое спасибо!
JohnnyHK придумал идеальное решение. Вот рабочий код PHP:
$cursor = $collection->find(array('age' => array('$not' => array('$type' => 2))), array('age' => 1)); $cursor->sort(array('age' => -1))->limit(1);
Вы можете использовать оператор $type
с $not
в вашем запросе, чтобы исключить документы, где age
– это строка. В оболочке ваш запрос будет выглядеть так:
db.test.find({age: {$not: {$type: 2}}}).sort({age: -1}).limit(1)
Или в PHP от Martti:
$cursor = $collection->find(array('age' => array('$not' => array('$type' => 2))), array('age' => 1)); $cursor->sort(array('price' => -1))->limit(1);
с драйвером PHP (mongodb)
используя findOne()
$filter=[]; $options = ['sort' => ['age' => -1]]; // -1 is for DESC $result = $collection->findOne(filter, $options); $maxAge = $result['age']
Вы можете использовать функцию aggregate для получения максимального количества из таких коллекций.
$data=$collection->aggregate(array ( '$group'=> array('_id'=>'', 'age'=>array('$max'=>'$age'.) ) ) );