2015-05-28 4 views
3

Я пытаюсь найти поле Parse.com, которое является массивом для частичной строки.parse.com поиск частичной строки в массиве

Когда поле в формате Струнный я могу сделать следующее:

// 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) 

Любые идеи? Спасибо :)

ответ

2

То, что вы пытались, является рациональным, но спецификаторы строк в PFQuery работают только на строках.

Я часто видел эту тему на SO: PFQuery предоставляет только базовые сравнения для простых атрибутов. Чтобы сделать что-либо еще, нужно запросить суперсеть и выполнить вычисления уровня приложения, чтобы уменьшить суперсет до нужного набора. Это дорого по двум причинам: скорость/пространство на уровне приложения, а также сетевая передача надмножества.

Первый расход смягчается, а второй расход устраняется с помощью облачной функции для уменьшения уровня надстройки на уровне приложения. Если вам все равно нужны записи надстроек на клиенте, подумайте о переносе этого запроса в облако.

Специфическая на этот вопрос, вот что я думаю, что функция облако будет выглядеть следующим образом:

// 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: на каждом.

+0

Я не совсем уверен, где и как реализовать это ... Я добавил код облака и вызвал его в (void) filterContentForSearchText, используя PFCloud callFunctionInBackground, но результат пуст ... –

+0

Возможно ничего соответствует? Вы не забыли развернуть развертывание? Хорошим шагом отладки было бы просто вернуть результат запроса (т. Е. Прокомментировать все в функции результата поиска и просто сказать «response.success (buses)»). Если это не удается, попробуйте выполнить hardcoding как «response.success (« hello world »)» и посмотрите, как это происходит. Я довольно уверен, что это работает (и не имеет лучшего альтернативного подхода). – danh

+0

Хорошо, поэтому переход на 'response.success (buses)' возвращает результат со всеми шинами. Тем не менее, я не могу получить какие-либо данные при поиске, хотя я на 1000% уверен, что строка (или ее часть) существует в массиве. Пример массива «route»: '[« Pak Thang Khlong Kwang »,« Mooban Sethakit »,« Mall Bang Khae »]' –

Смежные вопросы