如何在Google Cloud Datastore(Node.js)中执行“仅键查询”

9
我将尝试在Node.js中使用Google Datastore API进行“仅键查询”,就像文档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...
}

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

但是当我执行像这样的“仅键查询”(并且如文档中所示):

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

results[0]的返回值只是一个像这样的空对象数组:

results[0]: [ {}, {}, {}, {}, {}, ..., {}]

这里返回的空对象数量是给定类型记录的正确数量。但问题在于它们是空对象。我希望在这里获得每个记录的数据存储键。
另一方面,如果我进行“正常”的投影查询,使用“正常”的属性(比如“id”——在通过datastore.key[kind, record.id]定义键后,应该与数据存储键相同),那么我可以正确地检索到投影的“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
]

我的 "keys-only-query" 怎么出了问题呢?我按照文档描述的方式做了,但是却只得到了空结果。

注意:我只在 Datastore 模拟器中测试过。与AppEngine中一样的结果。

1个回答

8
对象不是空的,但只包含数据存储键,存储在符号属性下:datastore.KEY。在javascript中,默认情况下可能不输出符号属性。 可以使用符号datastore.KEY获取实体键。
var keys = results.map(function(res) {
     return res[datastore.KEY];
});

1
谢谢! (我了解到这似乎与一个名为“Symbol”的javascript东西有关,https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Symbol。我认为datastore.KEY属性就是这样一个“Symbol”,这就是为什么它不在正常对象表示中显示出来的原因。或类似于此(或完全不同)。也许当我真正理解它时,我会添加一些关于它的信息。) - trollkotze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接