mongodb:查找列的最高数值

时间:2013-02-25 17:22:08

标签: php mongodb find

我有包含多个字段的MongoDB文档集合。其中一列/字段应仅为数字,但其中一些字段包含非数字(损坏)数据作为字符串值。我应该找到该列的最高数值,不包括损坏的非数值数据。我知道Getting the highest value of a column in MongoDB这个问题,但是AFAIK,这个扩展的案例没有被涵盖。

以下示例描述了该问题。要获得最高值,应返回包含"age": 70的文档:

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

为find()/ findOne()查询提供PHP示例会有很大帮助。非常感谢!

JohnnyHK提出了完美的解决方案。这是有效的PHP代码:

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

4 个答案:

答案 0 :(得分:7)

您可以在查询中使用$type运算符$not来排除age为字符串的文档。在shell中,您的查询将如下所示:

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

或者来自Martti的PHP:

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

答案 1 :(得分:6)

with PHP driver (mongodb)
using findOne()

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

答案 2 :(得分:0)

您可以使用聚合函数从此类集合中获取最大数量。

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

答案 3 :(得分:0)

This works for me

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