Gcloud Datastore runQuery with .order返回错误412' Precondition Failed'

时间:2016-01-01 02:04:18

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

我正在使用Node JS上的Google Cloud平台数据存储区开发应用程序。使用Book Shelf示例中的部分代码。

当我在带有.filter()的runQuery方法中使用.order()时,返回错误代码为412 - ' Precondition Failed&#39 ;.当我这样做时,没有.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'

由于

1 个答案:

答案 0 :(得分:2)

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

  

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

因此keyoperatorconfig.order强烈相互约束:具体而言,如果运算符是不等式,则config.orderkey < em>必须相同 - 并且代码中的任何内容都不会检查它。