![](/img/trans.png)
[英]AppEngine: Query datastore for records with no condition for a specific property
[英]AppEngine datastore 'ends with' query
关于这个答案: https : //stackoverflow.com/a/1554837/1135424我发现可以使用类似以下内容来完成'以' 开头 :
MyModel.all().filter('prop >=', prefix).filter('prop <', prefix + u'\ufffd')
它提到进行“ 以...结尾 ”查询将需要存储字符串的反向,然后应用与上述相同的策略。
因此,例如,如果我当前的数据是域字符串,则类似于:
domains | reverse_domain
------- | --------------
.com.io | oi.moc.
.com.eu | ue.moc.
.com.mx | xm.moc.
如果我想查询以“ .io”结尾的域名,我应该这样做:
suffix = '.io'
MyModel.all().filter(
'reverse_domain >=', suffix).filter(
'reserve_domain <', suffix + u'\ufffd')
但是在测试时,在python命令行上进行字符串比较时,我得到以下信息:
>>> '.com.io'[::-1] >= '.io'
True
>>> '.com.io'[::-1] < '.io' + u'\ufffd'
False
更改顺序,先u'\\ ufffd' 后缀
>>> '.com.io'[::-1] < u'\ufffd' + '.io'
True
因此,想知道是否在执行' 以 ' 结尾 '时,除了反转存储数据的顺序之外,还应该首先使用u'\\ ufffd' ,如下所示:
MyModel.all().filter(
'reverse_prop >=', suffix).filter(
'reverse_prop <', u'\ufffd' + suffix)
在比较字符串时, 数据存储区过滤器是否遵循python相同的词典顺序?
基本上该怎么做:
SELECT domain FROM domains WHERE <domain name> LIKE CONCAT('%', domain)
例如,如果我搜索google.com.io ,则可以获取域“ .com.io ”,那么,如何获取以某些结尾的现有域/字符串列表?
更新 :
尽管测试似乎只需要将运算符> =更改为<= ,这给了我LIKE'%string' :
suffix = '.io'[::-1]
MyModel.all().filter(
'reverse_domain <=', suffix).filter(
'reserve_domain <', suffix + u'\ufffd')
如果我想搜索字符串是否以我已经拥有的某些记录结尾:
>>> assert('.com.io'[::-1] <= '.com.io'[::-1] and '.com.io'[::-1] < '.com.io'[::-1] + u'\ufffd')
>>> assert('.com.io'[::-1] <= 'google.com.io'[::-1] and '.com.io'[::-1] < 'google.com.io'[::-1] + u'\ufffd')
>>> assert('.com.io'[::-1] <= 'gle.com.io'[::-1] and '.com.io'[::-1] < 'gle.com.io'[::-1] + u'\ufffd')
如果您的用例涉及搜索顶级域,则建议将URL分为两个单独的属性。 这样可以轻松查找具有给定TLD的所有记录,并为其他搜索提供更大的灵活性。
如果您有数百万条记录,则也可以考虑使用整数来表示每个TLD。 它将减少数据的大小。
当您使用单个相等过滤器而不是两个不相等过滤器时,此方法也可能会更快一些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.