gpt4 book ai didi

node.js - Google Datastore 实体键 ID 是字符串而不是数字

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:00 28 4
gpt4 key购买 nike

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

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 创建新 key 时,例如

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

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

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

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

编辑

当您拥有另一个对象的“外键”并使用 key.id 来设置它时,此问题会变得更大。例如

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 进行查找。这并不是问题所在,因为类型在某种程度上隐藏在数据存储控制台中。

最佳答案

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

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

When using the ID to create a new key, e.g.

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

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

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

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

关于node.js - Google Datastore 实体键 ID 是字符串而不是数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45464022/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com