**更新**
感谢Alfred Fuller指出我需要为此查询创建一个手动索引。
不幸的是,从.NET应用程序使用JSON API,似乎没有官方支持的方法。实际上,从App Engine以外的应用程序来看,似乎没有正式的方法可以做到这一点,这很奇怪,因为Cloud Datastore API旨在允许访问App Engine以外的数据存储区。
我能找到的最接近的黑客是POST the index definition using RPC到http://appengine.google.com/api/datastore/index/add。有人可以给我一些关于如何准确执行此操作的原始规范(即URL参数,身体到底应该是什么样的等等),也许使用Fiddler来检查appcfg.cmd的调用?
**原始问题**
根据docs,“查询可以组合不同属性的等式(EQUAL)过滤器,以及单个属性上的一个或多个不等式过滤器”。
但是,此查询失败:
{
"query": {
"kinds": [
{
"name": "CodeProse.Pogo.Tests.TestPerson"
}
],
"filter": {
"compositeFilter": {
"operator": "and",
"filters": [
{
"propertyFilter": {
"operator": "equal",
"property": {
"name": "DepartmentCode"
},
"value": {
"integerValue": "123"
}
}
},
{
"propertyFilter": {
"operator": "greaterThan",
"property": {
"name": "HourlyRate"
},
"value": {
"doubleValue": 50
}
}
},
{
"propertyFilter": {
"operator": "lessThan",
"property": {
"name": "HourlyRate"
},
"value": {
"doubleValue": 100
}
}
}
]
}
}
}
}
以下回复:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "FAILED_PRECONDITION",
"message": "no matching index found.",
"locationType": "header",
"location": "If-Match"
}
],
"code": 412,
"message": "no matching index found."
}
}
答案 0 :(得分:6)
JSON API尚不支持本地索引生成,但我们已经记录了一个过程,您可以按照该过程生成https://developers.google.com/datastore/docs/tools/indexconfig#Datastore_Manual_index_configuration
索引的xml定义请试一试,如果不起作用,请告诉我们。
这是一个临时解决方案,我们希望尽快替换自动本地索引生成。
答案 1 :(得分:2)
错误“找不到匹配的索引”。表示需要添加索引才能使查询生效。请参阅auto index generation documentation。
在这种情况下,您需要一个具有属性DepartmentCode和HourlyRate的索引(按此顺序)。
答案 2 :(得分:1)
对于index.yaml
我用这3个链接修复了它:
和最重要的链接:
no matching index found
文件如上一个链接所述,索引通过将查询的结果集存储在索引中来允许复杂查询更快地运行。当您获得order
时,表示您尝试运行涉及filter
或index.yaml
的复杂查询。因此,为了使您的查询有效,您需要通过手动创建配置文件来定义您尝试运行的查询的索引,从而在google数据存储区索引上创建索引。以下是您的修复方法:
indexes
命名的文件夹中创建gcloud-node
文件,或者从{{1}获取灵感https://cloud.google.com/appengine/docs/python/config/indexconfig#Python_About_index_yaml gcloud preview datastore create-indexes indexes/index.yaml
请参阅https://github.com/GoogleCloudPlatform/gcloud-node/blob/master/system-test/data/index.yaml 例如,对于此查询:
var q = ds.createQuery('project')
.filter('tags =', category)
.order('-date');
index.yaml
看起来像:
indexes:
- kind: project
ancestor: no
properties:
- name: tags
- name: date
direction: desc
答案 3 :(得分:0)
尽量不要对结果进行排序。删除 orderby() 后,它对我有用。