7

我有包含多个字段的 MongoDB 文档集合。列/字段之一应仅为数字,但其中一些字段包含非数字(损坏)数据作为字符串值。我应该找到该列的最高数值,不包括损坏的非数值数据。我知道Get the high 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

4 回答 4

9

您可以在查询中使用$type运算符 with来排除字符串$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);
于 2013-02-25T17:34:08.150 回答
7


使用PHP 驱动程序(mongodb)findOne()

$filter=[];
$options = ['sort' => ['age' => -1]]; // -1 is for DESC
$result = $collection->findOne(filter, $options);
$maxAge = $result['age']
于 2016-10-20T20:00:14.863 回答
0

您可以使用聚合函数从这样的集合中获取最大数量。

$data=$collection->aggregate(array
                    ( '$group'=> 
                        array('_id'=>'',
                            'age'=>array('$max'=>'$age'.)
                        )
                    )
            );
于 2015-08-19T11:13:28.947 回答
0

这对我有用

$options = ['limit' => 100,'skip' => 0, 'projection' => ['score' => ['$meta' => 'textScore']], 'sort' => ['score' => ['$meta' => 'textScore']]];
于 2018-02-03T08:43:29.410 回答