【问题标题】:How do I find records in Azure table storage that don't match an array of values?如何在 Azure 表存储中查找与值数组不匹配的记录?
【发布时间】:2014-08-24 23:56:15
【问题描述】:

我正在尝试在 Azure 移动服务上执行“doesNotContainAllObjectsInArray”类型的操作。例如,假设我有一个名为 Number 的表,在该表中有这些记录,这些记录具有以下“数字”值:11111、22222、33333、44444。

我希望能够编写一个查询,允许我传入一个我特别不想要的数字数组,例如:[11111,44444] 应该让我使用[22222, 33333]

我尝试在我的 where 运算符中使用 JavaScript,但我收到一条错误消息,指出不支持该表达式。这是我尝试过的:

var numberTable = tables.getTable('Number');
var ignoreNumbers = ['11111', '44444'];
numberTable.where(function(numbers) {
    return (numbers.indexOf(this.number) > -1);
}, ignoreNumbers).read({
    success: function(foundNumbers) {
        console.log('Found ' + foundNumbers.length + ' numbers!');
    },
    error: function(error) {
        console.error('Error with query! ' + error);
    }
});

注意:我无法对 ignoreNumbers 值进行硬编码,因为该数组是从之前的查询中生成的。

谁能推荐我如何执行这样的查询?我需要构建一个 SQL 语句并使用mssql 执行它吗? (......甚至可以使用表存储吗?)

【问题讨论】:

    标签: javascript azure azure-mobile-services


    【解决方案1】:

    您正在描述Table Queries 中不支持的 SQL 除外运算符。我发现这样做的唯一方法是将表加载到内存中(由于大小的原因通常不可行),然后使用 LINQ 执行例外查询。

    【讨论】:

    • 谢谢!不幸的是,我使用的是 Azure 移动服务,所以我被限制使用 JavaScript,所以不能选择 LINQ。
    【解决方案2】:

    我设法通过创建一个 SQL 查询并通过 request.service.mssql 对象执行它来解决这个问题,如下所示:

    SELECT * FROM Number WHERE (number != '11111' && number != '22222')

    查询的 WHERE 部分是通过迭代 ignoreNumbers 数组并通过字符串连接构建 SQL 语句来构建的。

    不确定这是否是世界上最有效的方法,但实际上只有几个数字(可能是 5-10),而且到目前为止它似乎有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多