这是在mongodb中排序不敏感排序的一些问题

时间:2014-12-04 06:51:44

标签: php mongodb codeigniter

执行以下操作时,

$this->mongo_db->order_by(array('first_name' => 'ASC'))->get('users');

A-Z开头的记录位于以a-z开头的记录之前。 我希望它们按字母顺序排序,而不管它们的情况如何。

e.g。 AABBCCDD .... ZZ

2 个答案:

答案 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)