![](/img/trans.png)
[英]Trouble using an array of names to drive a search in parse.com database
[英]parse.com search for partial string in array
我正在尝试搜索Parse.com字段,该字段是部分字符串的数组。
当字段为String格式时,我可以执行以下操作:
// Update the filtered array based on the search text and scope.
// Remove all objects from the filtered search array
[self.searchResults removeAllObjects];
// Filter the array using NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.busnumber contains[c] %@", searchText];
self.searchResults = [NSMutableArray arrayWithArray:[self.objects filteredArrayUsingPredicate:predicate]];
这有效,但我要搜索的新字段是一个数组。 当我将其更改为以下内容时,它可以正常工作:
PFQuery * query = [PFQuery queryWithClassName:@"Bus"];
[query whereKey:@"route" equalTo:[NSString stringWithFormat:@"%@", searchText]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSLog(@"Objects: %@", objects);
if (error)
{
NSLog(@"ERROR: %@", error.localizedDescription);
}
else
{
[self.searchResults removeAllObjects];
[self.searchResults addObjectsFromArray:objects];
[self.searchDisplayController.searchResultsTableView reloadData];
}}];
但是我需要确切的字符串。
我希望能够搜索字符串的某些部分,但是当我将其更改为:
[query whereKey:@"route" containsString:[NSString stringWithFormat:@"%@", searchText]];
我明白了:
[Error]: $regex only works on string fields (Code: 102, Version: 1.7.4)
有任何想法吗? 谢谢 :)
你所尝试的是理性的,但PFQuery上的字符串限定符仅适用于字符串。
我经常在SO上看到这个主题:PFQuery只提供简单属性的基本比较。 要做更多的事情,必须查询超集并执行应用程序级别计算以将超集减少到所需的集合。 这样做很昂贵有两个原因:app级计算速度/空间和超集的网络传输。
通过使用云功能来降低超集的应用级别,可以减轻第一笔费用并消除第二笔费用。 除非您需要客户端上的超集记录,否则请考虑将此查询移至云端。
具体到这个问题,这就是我认为云功能类似的东西:
// very handy to have underscore available
var _ = require('underscore');
// return Bus objects whose route array contains strings which contain
// the passed routeSubstring (request.params.routeSubstring)
Parse.Cloud.define("busWithRouteContaining", function(request, response) {
// for now, don't deal with counts > 1k
// there's a simple adjustment (using step recursively) to get > 1k results
var query = new Parse.Query("Bus");
query.find().then(function(buses) {
var matching = _.select(buses, function(bus) {
var route = bus.get("route");
var routeSubstring = request.params.routeSubstring;
return _.contains(route, function(routeString) {
return routeString.includes(routeSubstring);
});
});
response.success(matching);
}, function(error) {
response.error(error);
});
});
如果您决定在客户端上执行缩减并需要代码帮助,我可以编辑它。这将是一个非常简单的切换到predicateWithBlock:
使用一个块来迭代数组属性并检查每个上的rangeOfString:
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.