2013-02-25 3 views
5

Ho raccolta di documenti MongoDB contenente diversi campi. Uno dei campi/colonne dovrebbe essere solo numerico, ma alcuni di questi campi contengono dati non numerici (corrotti) come valori di stringa. Dovrei trovare il valore numerico più alto di questa colonna, escludendo i dati corrotti e non numerici. Sono a conoscenza della domanda Getting the highest value of a column in MongoDB, ma AFAIK, questo caso esteso non era coperto.mongodb: trovare il valore numerico più alto di una colonna

L'esempio seguente illustra il problema. Per il valore più alto, il documento con "age": 70 deve essere restituito:

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

Fornire un esempio PHP per il find()/findOne() interrogazione sarebbe di molto aiuto. Molte grazie!

JohnnyHK ha trovato la soluzione perfetta. Ecco il codice PHP di lavoro:

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

risposta

7

È possibile utilizzare l'operatore $type con $not nella query per escludere documenti in cui age è una stringa. Nella shell query sarà simile:

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

O in PHP da Martti:

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

Wow che è stato veloce, grazie! Funziona perfettamente. Aggiungerò il codice PHP correlato al lavoro alla domanda. – martti

0

È possibile utilizzare la funzione di aggregazione per ottenere il massimo numero da collezioni come questo.

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

con autista PHP (MongoDB)
utilizzando findOne()

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

Questo funziona per me

$options = ['limit' => 100,'skip' => 0, 'projection' => ['score' => ['$meta' => 'textScore']], 'sort' => ['score' => ['$meta' => 'textScore']]];