使用JavaScript从Parse搜索不区分大小写的数据

10

我正在使用 Parse.com,并且使用 Javascript 访问它。 我想以这种方式搜索数据,使其不区分大小写,例如,如果我搜索 abc,则会返回 abc, Abc, ABC,aBc 等等,但当前只返回 abc

Javascript:

var search_data="Temp";
var product = Parse.Object.extend("product");
var query = new Parse.Query(product);

query.contains("name",search_data); 
query.find({
     success: function(results) {
        console.log("Total Product Found : "+results.length);
        printSearchProducts(results,query);  //custom method to print product detail
     },
     error: function(error) {
         console.log("Error: " + error.code + " " + error.message);
     }
 });

实际结果:Temp1,Temp2,Temp3,ProductTemp3,Temp4Product等

要求结果:Temp1,Temp2,Temp3,ProductTemp3,Temp4Product,temp5,producttemp6,TEMP7,tEMp8等

4个回答

42

你可以使用Parse.Querymatches()函数实现这个功能,虽然这在它的文档页面中没有明确说明,但你可以像这样使用它:

query.matches(key, value, 'i');
希望能够帮助到您。

完美运行!谢谢! - Daniel Albert
1
这应该是解决方案!https://parseplatform.github.io/Parse-SDK-JS/api/classes/Parse.Query.html#methods_matches - Captain Obvious
这是正确的答案,但在JSON和REST中如何实现呢? - user1099258
你如何在多个字段上进行查询?如果我一个接一个地添加 matches,即使是空查询,也不会得到任何结果。 - Chrillewoodz
@Chrillewoodz 我认为你可以使用复合查询来实现... - akmozo
这个答案是正确的,同时提到复合查询! - mrvnklm

5

目前,您无法通过查询执行不区分大小写的搜索。

然而,非常简单的解决方法是存储您需要在查询中使用的字段的小写版本。

创建该项

var Product = Parse.Object.extend("product");
var newProduct = new Product();
var productName = "Temp4Product";
newProduct.set("name",productName);
newProduct.set("name_lowercase",productName.toLowerCase());
newProduct.save(); 

执行查询

var search_data="Temp";
var product = Parse.Object.extend("product");
var query = new Parse.Query(product);

query.contains("name_lowercase",search_data.toLowerCase()); 
query.find({
     success: function(results) {
        console.log("Total Product Found : "+results.length);
        printSearchProducts(results,query);  //custom method to print product detail
     },
     error: function(error) {
         console.log("Error: " + error.code + " " + error.message);
     }
 });

在上面的示例中,我使用了string.toLowerCase()函数,但是你可能有更适合你使用的函数。基本上,你想找到一种方法来“简化”你的数据,以便可以执行适当的查询。


感谢@ahar083的回复,但我不想在parse.com上更改我的产品类中的大小写。 - Shashi
@Shashi 我并不建议你仅更改存储小写值。请注意,在我上面的示例中,我保存了“name”(保留大小写)以及“name_lowercase”。这种解决方案唯一的缺点是在表格中存储了稍微多一些的数据,但这不应该是一个大问题。目前还没有其他选择,因为 Parse 目前不支持不区分大小写的查询。他们可能会在未来添加此功能,但这会对后端性能产生影响。 - ardrian
1
@Shashi - 我还没有足够的声望来回复您在下面提出的答案。虽然您的答案是可行的,但效率非常低!您正在从 Parse.com 拉取500个项目到您的服务器上(或者如果这是在客户端浏览器中运行的 JavaScript,则是客户端机器)。您可能会拉取大约1MB的数据,而不是2KB,以致于用户等待响应的时间可能会从1秒变成1分钟。(这些数字是随意的,但只是为了给您一个想法)。 - ardrian
我只有400个产品,根据要求,我们不能在产品类中添加一个存储小写名称的额外列,因此下面的方法最适合我。我知道这不是最优解决方案,因为每次它获取所有产品数据,这可能会降低性能,正如你所说的那样。 - Shashi
1
@Shashi - 很好,总会有权衡的,只要你意识到增加的延迟和更大的下载量。如果是桌面应用程序,这可能完全没有问题。 - ardrian
显示剩余3条评论

0

提出一个额外存储小写值的解决方案,其缺点是需要额外的存储空间。 matches 方法可以工作,但会有轻微的性能损失。

一种更好的解决方案是使用聚合和投影中的$toLower表达式来避免这两个问题。


2
你好!我不理解你的解决方案,能否请您添加代码或者指导一下“在投影中使用$toLower表达式的聚合”是什么意思? - DJTano

-1

我已经解决了这个问题。 我删除了约束条件query.contains("name",search_data);,并在printSearchProducts方法中应用了使用JavaScript进行手动搜索的方式:

var search_data="Temp";
var product = Parse.Object.extend("product");
var query = new Parse.Query(product);
query.limit(500);
query.find({
    success: function(results) {
         printSearchProducts(results,query,search_data); 
    }, 
    error: function(error) {
         console.log("Error: " + error.code + " " + error.message);
   } 
});

printSearchProducts方法,通过JavaScript手动搜索。

function printSearchProducts(results,query,search_data) {
    var counter = results.length; 
    var productName = '',i=0; 
    search_data = search_data.toLowerCase(); 
    if(counter){
        while(i<counter){
            var found = -1;
            productName = results[i].get("name");
            var lower_name = productName.replace(/[^a-zA-Z]/g,'_').toLowerCase();
            found = lower_name.indexOf(search_data);
            if(found>=0) {
                  //Access or print the required result here 
            } 
            i++;
        }
    }  
}

2
我强烈建议不要使用这种方法,因为每次搜索时您都将下载所有产品,并且如果您最终拥有超过500个产品(或者如果您将限制增加到最大值,则为1000个),则会出现问题。如果您需要在页面的其他部分中使用所有产品,则可能可以接受此方法,但并不理想。 - Timothy Walters
1
@TimothyWalters:我只有400个产品,根据要求,我们不能在产品类中添加一个额外的列来存储小写名称,因此上述方法最适合我。我知道这不是最优解决方案,因为每次它都会获取所有产品数据,这可能会降低性能。 - Shashi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接