【问题标题】:Case insensitive search inside projection condition投影条件内不区分大小写的搜索
【发布时间】:2018-11-02 07:29:55
【问题描述】:

酒店表中的数据是这样存储的

   {
     _id: ....,
     HotelName: ...,
     MasterKeyDetails:[
     { 
       MasterKeyId: 36K1,
       ...
     },
     {
        MasterKeyId: 36J1,
       ...
     }
     ]

  }

我在下面写了查询

       $cursor = $this->collection->aggregate(array(
                array(
                    '$match' => array(
                        "_id" => new MongoDB\BSON\ObjectID($this->id)
                    )
                ),
                array(
                    '$project' => array(
                        'MasterKeyDetails' => array(
                            '$filter' => array(
                                'input' => '$MasterKeyDetails',
                                'as' => 'room',
                                'cond' => array(
                                    '$eq' => array('$$room.MasterKeyId', $this->MasterKeyId)
                                )
                            )
                        ),
                    )
                )
            )
         )->toArray();

搜索正常。 $this->MasterKeyId 包含 36k1 时搜索,但 $this->MasterKeyId 包含 36k1 时不搜索。尽管有区分大小写的数据,但我希望它应该获取...

请帮忙!!!

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework mongodb-php php-mongodb


    【解决方案1】:

    您可以使用$toUpper 来规范化数据:

       $cursor = $this->collection->aggregate(array(
                array(
                    '$match' => array(
                        "_id" => new MongoDB\BSON\ObjectID($this->id)
                    )
                ),
                array(
                    '$project' => array(
                        'MasterKeyDetails' => array(
                            '$filter' => array(
                                'input' => '$MasterKeyDetails',
                                'as' => 'room',
                                'cond' => array(
                                    '$eq' => array(array('$toUpper' =>'$$room.MasterKeyId'), $this->MasterKeyId)
                                )
                            )
                        ),
                    )
                )
            )
         )->toArray();
    

    以同样的方式确保您必须提供用于比较的数据也是相同的情况。如果您喜欢这种方式,还有$toLower

    目前还没有其他“不区分大小写的匹配”函数可以用作聚合管道的一部分,因此“规范化”是当前的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2013-09-26
      • 2023-03-20
      • 1970-01-01
      • 2011-05-01
      • 2011-01-02
      相关资源
      最近更新 更多