2013-02-25 2 views
5

У меня есть сборник документов MongoDB, содержащий несколько полей. Один из столбцов/полей должен быть только числовым, но некоторые из этих полей содержат нечисловые (поврежденные) данные в виде строковых значений. Я должен найти наивысшее числовое значение этого столбца, исключая коррумпированные, не численные данные. Я знаю вопрос Getting the highest value of a column in MongoDB, но AFAIK, этот расширенный случай не был охвачен.mongodb: нахождение наивысшего числового значения столбца

В приведенном ниже примере изображена проблема. Для максимального значения, документ с "age": 70 должен быть возвращен:

[ 
{ 
    "id": "aa001", 
    "age": "90" 
}, 
{ 
    "id": "bb002", 
    "age": 70 
}, 
{ 
    "id": "cc003", 
    "age": 20, 
} 
] 

Обеспечение PHP примера для находки()/findOne() запрос будет иметь большую помощи. Большое спасибо!

JohnnyHK разработал идеальное решение. Вот рабочий код PHP:

$cursor = $collection->find(array('age' => array('$not' => array('$type' => 2))), array('age' => 1)); 
$cursor->sort(array('age' => -1))->limit(1); 

ответ

7

Вы можете использовать $type оператор с $not в запросе, чтобы исключить документы, где age является строкой. В оболочке Ваш запрос будет выглядеть следующим образом:

db.test.find({age: {$not: {$type: 2}}}).sort({age: -1}).limit(1) 

Или в PHP из Мартти:

$cursor = $collection->find(array('age' => array('$not' => array('$type' => 2))), array('age' => 1)); 
$cursor->sort(array('price' => -1))->limit(1); 
+0

Ничего себе это было быстро, спасибо! Работает отлично. Я добавлю связанный с PHP код PHP к вопросу. – martti

0

Вы можете использовать агрегатную функцию, чтобы получить максимальное количество из коллекций, как это.

$data=$collection->aggregate(array 
        ('$group'=> 
         array('_id'=>'', 
          'age'=>array('$max'=>'$age'.) 
         ) 
        ) 
      ); 
3

с драйвером PHP (MongoDB)
использованием findOne()

$filter=[]; 
$options = ['sort' => ['age' => -1]]; // -1 is for DESC 
$result = $collection->findOne(filter, $options); 
$maxAge = $result['age'] 
0

Это работает для меня

$options = ['limit' => 100,'skip' => 0, 'projection' => ['score' => ['$meta' => 'textScore']], 'sort' => ['score' => ['$meta' => 'textScore']]]; 
Смежные вопросы