执行以下操作时,
$this->mongo_db->order_by(array('first_name' => 'ASC'))->get('users');
以A-Z
开头的记录位于以a-z
开头的记录之前。
我希望它们按字母顺序排序,而不管它们的情况如何。
e.g。 AABBCCDD .... ZZ
答案 0 :(得分:1)
这是因为MongoDB没有不区分大小写的索引(https://jira.mongodb.org/browse/SERVER-90)和两个(它之所以没有)是因为它还没有排序规则({{3 }})。
Derick Rethans,PHP驱动程序维护者之一,最近撰写了一篇博文,其中包含一个可能的自然语言排序解决方案,https://jira.mongodb.org/browse/SERVER-1920但它仍然需要一个单独的字段
答案 1 :(得分:0)
问题在于A-Z < a-z
的{{3}}值。
您需要在聚合管道中使用ascii函数,如下所示,
Project
每个记录的额外字段,用于保存first_name
小写。Sort
根据投影字段按升序排列。Project
必填字段。mongo shell中可接受的代码:
db.collection.aggregate([
{$project:{"users":1,"first_name":{$toLower:"$first_name"}}},
{$sort:{"first_name":1}},
{$project:{"users":1,"_id":0}}
],{allowDiskUse:true})
如果您的企业允许以{小写或大写形式存储first_name
字段值,则可以避免此问题。更重要的是,您可以将first_name
字段编入索引,并在此情况下查询first_field
的存储。
根据要求,请在下面找到PHP中的代码:
$proj1 = array("users" => 1,'first_name' => array ('$toLower' => '$first_name'))
$sort = array("first_name" => 1)
$proj2 = array("users" => 1,"_id" => 0)
$options = array("allowDiskUse" => true)
$collection -> aggregate(array($proj1,$sort,$proj2),$options)