7

複数のフィールドを含むドキュメントの MongoDB コレクションがあります。列/フィールドの 1 つは数値のみである必要がありますが、これらのフィールドの一部には、数値以外の (破損した) データが文字列値として含まれています。破損した非数値データを除いて、この列の最大数値を見つける必要があります。質問Get the maximum value of a column in MongoDB を認識していますが、私の知る限り、この拡張ケースはカバーされていませんでした。

以下の例は、この問題を示しています。最高値の場合、次のドキュメント"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ます。シェルでは、クエリは次のようになります。

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 に答える