如何在Google Cloud数据存储(Node.js)中执行仅键查询(&Q)

人气:362 发布:2022-10-16 标签: node.js google-app-engine google-cloud-datastore

问题描述

我正在尝试使用Google Datastore API for Node.js执行"仅键查询",如文档here所示。

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

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

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

记录已正确存储。我可以通过

毫无问题地检索它们
datastore.runQuery(datastore.createQuery(kind))
.then( (results) => {
    // whatever...
}

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

但当我执行这样的"仅键查询"时(和as exemplified in the documentation):

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

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

results[0]: [ {}, {}, {}, {}, {}, ..., {}]
此处返回的空对象数是给定类型的正确记录数。但问题是,它们是空洞的物体。我希望在这里获得每个记录的数据存储区密钥。

另一方面,如果我对"Normal"属性(如"id"--据我所知,在通过datastore.key[kind, record.id]定义键之后,它应该与数据存储键相同)执行"Normal"投影查询,则我正确地检索到投影的"id"属性,从而:

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

结果:

results[0]: [ 
  { id: 5289385927 },
  { id: 5483575687 },
  { id: 5540575111 },
  { id: 5540622279 },
  // ... and so on
]
那么,我的"仅键查询"有什么问题呢?我已经完全按照文档描述的方式完成了。但我只能得到空结果。

注意:我仅在数据存储仿真程序中测试过此功能。在数据存储仿真程序中的结果与在AppEngine中的结果相同。

推荐答案

对象不是空的,而是仅包含存储在符号属性下的数据存储键:datastore.KEY。在Java脚本中,默认情况下可能不会输出符号属性。

您可以使用符号datastore.KEY

获取实体键
var keys = results.map(function(res) {
     return res[datastore.KEY];
});

334