如何在Google Cloud Datastore(Node.js)中执行"仅限密钥查询"

tro*_*tze 5 google-app-engine node.js google-cloud-datastore

我试图做一个"纯键查询"与谷歌的数据存储API对Node.js的,如文档中的例子在这里.

我保存了许多这样的记录后这样做:

datastore.save(
  records.map(
    (record) => {
      return {
        key: datastore.key([kind, record.id]),
        data: record,
      };
    }
  )
Run Code Online (Sandbox Code Playgroud)

常量kind是一个字符串.每个record都有一个有效的唯一id属性(一个数字),如此处所示,它也应该作为数据存储区密钥标识符.

记录存储正确.我可以毫无问题地检索它们

datastore.runQuery(datastore.createQuery(kind))
.then( (results) => {
    // whatever...
}
Run Code Online (Sandbox Code Playgroud)

正确返回所有已保存的记录.

但是,当我这样做"仅限密钥的查询"时(并在文档中举例说明):

const query = datastore.createQuery(kind)
  .select('__key__');
datastore.runQuery(query)
.then( (results) => {
    // whatever...
}
Run Code Online (Sandbox Code Playgroud)

我的results[0]返回值只是一个空对象数组,如下所示:

results[0]: [ {}, {}, {}, {}, {}, ..., {}]
Run Code Online (Sandbox Code Playgroud)

此处返回的空对象数是给定类型的正确记录数.但问题是它们是空物.我希望在这里获得每条记录的数据存储区密钥.

另一方面,如果我在"正常"属性上执行"正常"投影查询(例如"id" - 应该与数据存储区键相同,据我所知,在定义了密钥之后datastore.key[kind, record.id]) ,我正确检索投影的"id"属性,因此:

const query = datastore.createQuery(kind)
  .select('id');
datastore.runQuery(query)
.then( (results) => {
    // whatever...
}
Run Code Online (Sandbox Code Playgroud)

结果:

results[0]: [ 
  { id: 5289385927 },
  { id: 5483575687 },
  { id: 5540575111 },
  { id: 5540622279 },
  // ... and so on
]
Run Code Online (Sandbox Code Playgroud)

那么我的"仅限密钥查询"有什么问题?我完全按照文档描述的方式完成了它.但我只得到空洞的结果.

注意: 我仅在数据存储模拟器中测试过此.数据存储模拟器中的结果与AppEngine中的结果相同.

小智 5

对象不为空,但仅包含数据存储区键,这些键存储在符号属性下:datastore.KEY.在javascript中,默认情况下可能不会输出符号属性.

您可以使用符号获取实体密钥 datastore.KEY

var keys = results.map(function(res) {
     return res[datastore.KEY];
});
Run Code Online (Sandbox Code Playgroud)