我有包含多个字段的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);
答案 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']]];