【问题标题】:Gcloud Datastore runQuery with .order returns error 412 'Precondition Failed'带有 .order 的 Gcloud Datastore runQuery 返回错误 412“前提条件失败”
【发布时间】:2016-04-05 19:34:46
【问题描述】:

我正在 Node JS 上使用 Google Cloud 平台 Datastore 开发应用程序。使用书架示例中的部分代码。

当我在带有 .filter() 的 runQuery 方法中使用 .order() 时,会返回错误代码 412 - 'Precondition Failed'。当我在没有 .order() 或 .filter() 的情况下这样做时,效果很好。我做错了什么?

在下面的代码中: list() 有效; readByQuery() 没有。

function list(limit, token, cb) {
    var q = ds.createQuery(namespace, kind)
        .limit(limit)
        .order(config.order)
        .start(token);

    ds.runQuery(q, function (err, entities, cursor) {
        if (err) {
            return cb(err);
        }
        var hasMore = entities.length === limit ? cursor : false;
        cb(null, entities.map(fromDatastore), hasMore);
    });
}

function readByQuery(key, operator, value, limit, token, cb) {
    var q = ds.createQuery(namespace, kind)
        .filter(key+ ' ' + operator, value)
        .order(config.order)
        .limit(limit)
        .start(token);

    ds.runQuery(q, function (err, entities) {
        if (err) {
            console.log(err);
            return cb(err);
        }
        cb(null, entities.map(fromDatastore));
    });
}

方法 readByQuery() 返回:

[ApiError: Precondition Failed]
    errors: [],
    code: 412,
    message: 'Precondition Failed'

谢谢

【问题讨论】:

    标签: node.js google-app-engine google-cloud-datastore


    【解决方案1】:

    您遇到了典型的数据存储限制,有据可查,例如 https://cloud.google.com/appengine/docs/go/datastore/queries

    注意:由于 App Engine Datastore 执行查询的方式,如果查询指定属性的不等式过滤器和其他属性的排序顺序,则不等式过滤器中使用的属性必须在其他属性之前排序。

    所以keyoperatorconfig.order相互强约束:具体来说,如果运算符是不等式,那么config.orderkey必须相同 - - 你的代码中没有任何东西可以检查。

    【讨论】:

    • 谢谢亚历克斯,它有据可查,下次我需要花更多时间阅读:) 但是,我仍然无法理解如何获取数据,对其进行排序并限制为 10,例如。类型是带有 userID 字段的“ActivityLog”。我如何获得 userId = 123 的最后 10 个活动(按 -timestamp 排序)?
    • 过滤用户 ID equal 到 123,并按 -timestamp 排序 - 没有矛盾。您的 readByQuery 太笼统了——它适用于某些参数组合(例如,filter("userId =", 123),因为这不是不等式),不适用于其他参数。而且你没有向我们展示你在失败的情况下是如何称呼它的(这是难题的关键!)。
    • 现在全部修复。并同意,它太笼统了,但它不适用于失败的情况“userId 等于 123,并按 -timestamp 排序”。我尝试运行过滤器,然后单击“时间戳”字段在 Web 数据存储控制台 (console.developers.google.com/datastore) 中订购。它显示错误“您的数据存储没有此查询所需的复合索引(开发人员提供)。”我按照stackoverflow.com/a/31928803/5735196 的步骤进行操作,现在已修复。不知道这是一个错误,还是我不完全了解数据存储区的工作原理。感谢您的帮助。
    • 啊 -- 缺少综合索引,我应该考虑一下 -- 抱歉,我会声称 Cenone di San Silvestro(非常传统的意大利盛宴,而且,我)的后遗症我在硅谷找到了一家餐厅服务得当,并在 12 月 31 日晚上与我的妻子和朋友在那里度过了我的精神失常。我希望 412 错误可以为“缺少所需索引”与“不等式与顺序冲突”提供一个单独的、更具解释性的正文,但是,这真的很难……对不起!
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多