繁体   English   中英

parse.com在数组中搜索部分字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM