使用数字键将实体保存到数据存储区时:
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
进行查找。目前还不明白这是问题所在,因为类型在数据存储控制台中有些隐藏。
答案 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)]);