Google数据存储区实体密钥ID是字符串而不是数字

时间:2017-08-02 14:44:39

标签: node.js google-cloud-datastore google-cloud-platform

使用数字键将实体保存到数据存储区时:

datastore.save({
  key: datastore.key(['Thing', 123]),
  data: [
    { name: 'name', value: 'My thing' }
  ]
});

然后再次检索

datastore
  .createQuery('Thing')
  .filter('__key__', datastore.key(['Thing', 123]))
  .select('__key__')
  .run((err, entities) => {
    const key = entities[0][datastore.KEY];
    console.log(`key.id = ${key.id}, type = ${typeof key.id}`);
  });

输出:

 key.id = 123, type = string

但我希望它输出:

 key.id = 123, type = number

数据存储库似乎转到through great lengths to ensure that the ID is a number,但后来继续将其作为字符串返回。使用ID创建新密钥时,例如

const newKey = datastore.key(['Thing', key.id]);

这会返回一个无法找到任何实体的密钥,因为该值将分配给name而不是id,因为它是一个字符串。

我在这里做了一个小的repro案例: https://github.com/arjenvanderende/datastore-key-id-is-string

我觉得这个ID作为字符串而不是数字返回似乎很奇怪。这是预期的行为还是库中的错误?

修改

当你有一个"外键"这个问题会成为一个更大的问题。到另一个对象,然后使用key.id进行设置。 E.g。

datastore.save({
  key: datastore.key(['Thing', 234]),
  data: [
    { name: 'name', value: 'My other thing' }
    { name: 'parentThingId', value: thing[datastore.KEY].id }
  ]
});

从数据存储区再次检索此对象后,查找其他对象的父对象将失败。使用密钥datastore.key(['Thing', otherThing.parentThingId)在数据存储区中执行查找将不会产生任何结果,因为它会尝试按name而不是id进行查找。目前还不明白这是问题所在,因为类型在数据存储控制台中有些隐藏。

1 个答案:

答案 0 :(得分:2)

这是一个字符串,但它被识别为id。当您使用key对象进行将来的请求时,API会执行正确的操作。

我们必须在库中进行一些特殊情况处理,因为ID可能很长 - 超出了JavaScript整数的允许上限。我们将其存储为字符串是一个内部工件,不应该影响用户。

  

使用ID创建新密钥时,例如

const newKey = datastore.key(['Thing', key.id]);

为什么不使用key本身而不是创建新的Key对象?

或者,您可以使用以下方法强制执行ID类型:

const newKey = datastore.key(['Thing', datastore.int(key.id)]);