php mongodb如何排序不区分大小写

时间:2014-04-15 11:19:04

标签: php mongodb

我面临着php mongodb排序不区分大小写的问题,我怎么能用不区分大小写排序? 下面是我的代码

$competency = $this->collection->find()->sort(array( "name" => 1 ));

3 个答案:

答案 0 :(得分:2)

不是你可以用find做的事情,但你可以用聚合来解决这个问题。所以考虑一下文件:

{ "a" : "zzz" }
{ "a" : "AAA" }
{ "a" : "BBB" }
{ "a" : "ccc" }
{ "a" : "ZZZ" }

你会发出这样的聚合语句:

db.collection.aggregate([
    // Use the $match statement just the same as a find
    //{ "$match": { */Some Statement /*  } }

    // Project a lowercased field
    { "$project": { 
        "a": 1,
        "sortKey": { "$toLower": "$a" }
    }},

    // Sort on that field
    { "$sort": { "sortKey": 1 } },

    // Optionally remove that field
    { "$project": {
        "a": 1
    }}      
 ])

这样就可以了:

{ "a" : "AAA" }
{ "a" : "BBB" }
{ "a" : "ccc" }
{ "a" : "zzz" }
{ "a" : "ZZZ" }

与正常的.find()形式相反:

db.collection.find().sort({ "a": 1 })

{ "a" : "AAA" }
{ "a" : "BBB" }
{ "a" : "ZZZ" }
{ "a" : "ccc" }
{ "a" : "zzz" }

答案 1 :(得分:2)

虽然MondoDB不提供它,但您可以很容易地在PHP中完成它。这是怎么做的。

$cn = new MongoClient($dbHost);
$db = $cn->selectDB($dbName);
$col = new MongoCollection($db, $collectionName);

$cursor = $col->find();
$cursor = iterator_to_array($cursor);

foreach ($cursor as $key => $row) {
    $name[$key] = $row['name'];
    $email[$key] = $row['email'];
}
//$name is the field to sort on, taken from the above loop
//You can use SORT_ASC or SORT_DESC

array_multisort($name, SORT_ASC, $cursor);

foreach ($cursor as $doc) {
    echo $doc['name'].'-'.$doc['email'].'<br/>';
}

答案 2 :(得分:1)

注意:此答案已过期。 MongoDB现在具有不区分大小写的索引处理以及排序规则。

我将把它作为一个答案,因为从我能看到的它是现在最好的选择。

您可以使用聚合框架,如@Neil所示。在我看来,这种方法并不是一个好方法。

首先它会遍历整个结果集,投射一个计算字段(存储在内存中),然后进行内存排序(限制在大约32MB RAM,或者在某些情况下为10%系统RAM,这可能已经使用$out选项更改了版本2.6,无论哪种方式,它仍然是非常低效的,更不用说所有这些文档的$out的IO瓶颈)。

相反,我会存储两种形式的字段,一种是原始的,一种是规范化的,并按标准化排序,或者只是忽略原始版本和存储严格规范化。