2013-02-25 9 views
5

Mam kolekcję dokumentów MongoDB zawierającą kilka pól. Jedna z kolumn/pól powinna być tylko numeryczna, ale niektóre z tych pól zawierają nie numeryczne (uszkodzone) dane jako wartości łańcuchowe. Powinienem znaleźć najwyższą wartość liczbową tej kolumny, wyłączając uszkodzone, nieliczbowe dane. Znam pytanie: Getting the highest value of a column in MongoDB, ale AFAIK, ten rozszerzony przypadek nie został uwzględniony.mongodb: znalezienie najwyższej wartości liczbowej kolumny

Poniższy przykład przedstawia problem. Dla najwyższej wartości, dokument z "age": 70 powinny być zwrócone:

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

Zapewnienie przykład PHP dla find()/findOne() zapytanie byłoby zbyt pomocne. Wielkie dzięki!

JohnnyHK wymyślił idealne rozwiązanie. Oto działa kod PHP:

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

Odpowiedz

7

Można użyć operatora $type z $not w zapytaniu wykluczyć docs gdzie age jest ciągiem. W powłoce zapytanie będzie wyglądać następująco:

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

Albo w PHP od Martti:

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

Wow, że był szybki, dzięki! Działa świetnie. Dodam działający kod PHP do pytania. – martti

0

Można użyć funkcji zagregowanego, aby uzyskać maksymalną liczbę ze zbiorów takich jak ten.

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

z kierowcą PHP (MongoDB)
użyciu findOne()

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

Działa to dla mnie

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