在投影条件内搜索不区分大小写
Case insensitive search inside projection condition
酒店table的数据存储方式如
{
_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 时不搜索。我希望它应该获取尽管区分大小写的数据...
请帮忙!!!
您可以使用$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
。
目前还没有其他 "case insensitive match" 函数可以用作聚合管道的一部分,因此 "normalizing" 是当前的方法。
酒店table的数据存储方式如
{
_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 时不搜索。我希望它应该获取尽管区分大小写的数据...
请帮忙!!!
您可以使用$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
。
目前还没有其他 "case insensitive match" 函数可以用作聚合管道的一部分,因此 "normalizing" 是当前的方法。