我使用 Google Cloud Datastore 来存储由 Datastore 生成的 ID 作为主键的实体。此外,在此示例中,我为每个实体存储了其他属性owner
。
Google Cloud Datastore 控制台中的实体如下所示:
|Name/ID |owner |...|
|id=5657437197565952 |5634472569470976|...|
然后我想根据key (id)
和过滤实体owner
。
为此,我知道我需要一个复合索引才能同时过滤字段(id)和所有者。所以我使用以下index.yaml
文件创建了一个复合索引:
indexes:
- kind: job
ancestor: no
properties:
- name: __key__
- name: owner
# AUTOGENERATED
该索引显示在云控制台中,如果我使用云控制台 UI 过滤这两个字段,它会过滤表中的正确实体。我在那里做的过滤器是:
- 密钥与以下内容一样大:
key(job,5657437197565952)
- 所有者等于字符串:
5634472569470976
但是,当我尝试使用以下代码通过 Google 使用 Node.js 库检索此实体时,我没有得到任何结果:
const {Datastore} = require('@google-cloud/datastore');
async function quickStart() {
const projectId = 'myproject';
// Creates a client
const datastore = new Datastore({
projectId: projectId,
});
const keySelector = datastore.key(['myentity', '5657437197565952']);
const query = datastore.createQuery('myentity').filter('key', keySelector).filter('owner', '=', '5634472569470976');
const val = await query.run((err, entities, info) => {
console.log(entities);
});
console.log('Got ' + val);
}
quickStart().catch(console.error);
entities
是空的,如果字符串化,则val
如下所示:
[[],{"moreResults":"NO_MORE_RESULTS","endCursor":"CgA="}]
我还尝试使用名称id
而不是创建另一个索引,__key__
但没有运气。
我现在的问题是:我需要什么复合索引才能在两个字段上执行此过滤器,以便 NodeJS 代码也正确检索实体?