Azure移动服务 - 根据匹配的字符串/子字符串值获取行

时间:2014-12-21 07:13:59

标签: javascript azure azure-mobile-services

我正在尝试从JavaScript azure移动服务中读取结果,并且我想返回具有特定值的项目。我正在使用getTable('')。其中。('')。read('')检查返回的json值之一是否与特定模式匹配,如this post所示:

这是我的客户端脚本:

function getSP() {

var spUser = client.getTable("User").where(function (contains) {

    return this.extraname.indexOf(contains) > 0;

}, "Eyad").read().done(function (results) {
    alert(JSON.stringify(results));
}, function (err) {
    alert("Error: " + err);
});}

从客户端生成请求URL:

https://XYZ.azure-mobile.net/tables/User?$filter=(indexof(extraname,'Eyad') gt 0)

但是上面的代码从服务返回一个空的[]对象,而执行相同的操作而没有where()检查清楚地返回我的预期值: enter image description here

我做错了什么?如何返回返回" extraname"的行。包含子串" Eyad"?


注意:我在服务端也有一个自定义阅读脚本,你可以看到" extraname"为测试目的,值是硬编码的:

function read(query, user, request) {
request.execute({
    success: function(results) {
        var now = new Date();
        results.forEach(function(item) {
            console.log(item.userjsondata);
            item.extraname = "Eyad";
        });
        request.respond(); //Writes the response
    }
});

}

2 个答案:

答案 0 :(得分:1)

如果您正在动态生成新列,则无法直接使用$filter子句根据该值过滤结果。请注意,您可以编写任意代码来计算该值,因此移动服务运行时无法知道它最终会生成什么值,并且无法基于此执行过滤。

您的解决方案有几种解决方法:如果可能,您可以使用与生成值相同的表达式发送where子句。在某些情况下,服务也会接受$filter子句中的表达式。这样做有一个缺点,就是你会在两个不同的地方找到相同的逻辑,并且很有可能你会改变一个并最终忘记改变另一个。

另一种方法是传递要查询生成的属性的参数而不是$filter参数(即,不要使用where函数,而是传递read内的参数{1}}调用。这些参数将传递到read对象中的request.parameters脚本,您可以在完成阅读后根据该值添加逻辑进行过滤数据库(见下文)。

<强>客户端:

var spUser = client.getTable("User").read({mustContain: "Eyad").done(function (results) {
    alert(JSON.stringify(results));
}, function (err) {
    alert("Error: " + err);
});}

<强>服务

function read(query, user, request) {
    var mustContain = request.parameters.mustContain;
    request.execute({
        success: function(results) {
            var now = new Date();
            var filteredResults = [];
            results.forEach(function(item) {
                console.log(item.userjsondata);
                item.extraname = "Eyad";
                if (item.extraname.indexOf(mustContain) >= 0) {
                    filteredResults.push(item);
                }
            });
            request.respond(200, filteredResults); //Writes the response
        }
    });
}

答案 1 :(得分:0)

改变你的比较:

return this.extraname.indexOf(contains) > 0;

到此:

return this.extraname.indexOf(contains) >= 0;

在第一个索引中可以找到匹配的字符串(在您的情况下,总是)。因此,您必须使用大于OR等于运算符来处理该情况。