【问题标题】:Here is some issue for sorting insensitive sort by in mongodb这是在 mongodb 中排序不敏感排序的一些问题
【发布时间】:2014-12-04 06:51:43
【问题描述】:

在执行以下操作时,

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

A-Z 开头的记录排在以a-z 开头的记录之前。 我希望它们按字母顺序排序,而不考虑它们的大小写。

例如AaBbcCDd....Zz

【问题讨论】:

  • 您的问题到底是什么,您想进行代码审查?
  • 我想同时进行 a-z 和 A-Z 排序。
  • 但我得到了第一个 A-Z,然后是 a-z

标签: php mongodb codeigniter


【解决方案1】:

这是因为 MongoDB 一方面没有不区分大小写的索引(https://jira.mongodb.org/browse/SERVER-90),另一方面(没有的原因)是因为它还没有排序规则(https://jira.mongodb.org/browse/SERVER-1920)。

PHP 驱动程序维护者之一的 Derick Rethans 最近写了一篇博客文章,其中提出了一种可能的自然语言排序解决方案,http://derickrethans.nl/mongodb-collation.html,但它仍然需要一个单独的字段

【讨论】:

    【解决方案2】:

    问题在于A-Z < a-zascii 值。

    您需要在聚合管道中使用$toLower函数,如下所示,

    • 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)
    

    【讨论】:

    • 有效,但这对于大型收藏品来说是否很快?我对此表示怀疑,因为排序必须知道整个集合才能工作。作为替代方案,我建议使用规范化字段,其中字符串值仅以小写或大写形式存储,并可能替换带有变音符号的字符或特殊连字字符,例如 ߯。如果需要的话,这也使得在该字段中进行搜索变得更加容易。
    • 是的,完全同意。由于 OP 没有提到集合大小,我给出了这个答案。如果数据被标准化,这个问题一开始就不会发生。 {allowDiskUse:true} 应该在这里帮忙吗?
    • 我正在使用 codeigniter 库。那么你能告诉我它是如何与这个库一起工作的吗?
    • stackoverflow.com/questions/15696802/… - 希望这会有所帮助。
    • 我怎样才能把它转换成核心 php 语言你能给我一些介绍..?
    猜你喜欢
    • 2018-04-08
    • 2010-11-04
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多