投影条件下不区分大小写的搜索

时间:2018-11-02 07:29:56

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

酒店表中的数据存储方式

   {
     _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时,它将不搜索。我希望它尽管存在区分大小写的数据也应获取...

请帮助!!!

1 个答案:

答案 0 :(得分: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

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