我试图搜索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)
有什么想法吗?谢谢:))
答案 0 :(得分:2)
你所尝试的是理性的,但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:
。