我正在使用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'
由于
答案 0 :(得分:2)
您遇到了典型的数据存储限制,例如在https://cloud.google.com/appengine/docs/go/datastore/queries有详细记录:
注意:由于App Engine数据存储执行查询的方式,如果查询指定属性上的不等过滤器并对其他属性排序,则必须在其他属性之前排序不等过滤器中使用的属性。
因此key
,operator
和config.order
强烈相互约束:具体而言,如果运算符是不等式,则config.order
和key
< em>必须相同 - 并且代码中的任何内容都不会检查它。