我面临着php mongodb排序不区分大小写的问题,我怎么能用不区分大小写排序? 下面是我的代码
$competency = $this->collection->find()->sort(array( "name" => 1 ));
答案 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瓶颈)。
相反,我会存储两种形式的字段,一种是原始的,一种是规范化的,并按标准化排序,或者只是忽略原始版本和存储严格规范化。