如何在NodeJS中通过生成的ID查询Google Cloud Datastore实体
用自动生成的ID查询Google Cloud Datastore实体(Node.js)
嘿,刚上手Datastore确实容易在ID查询这里卡壳,我来帮你梳理清楚怎么用自动生成的ID查询实体~
首先要明确一个关键点:当你调用datastore.save()保存一个没有指定ID的实体时,Datastore会自动生成一个唯一ID,并且这个ID会直接填充到你传入的key对象里。也就是说,在save的回调函数里,你手里的key已经不是原来那个空key了,它已经包含了生成的ID值。
方法一:直接用更新后的Key查询
这是最简单的方式,你代码里其实已经写了一部分,但要确保用的是save完成后的key:
datastore.save([entity], (error, apiResponse) => { if (error) { console.error('保存出错:', error); return; } // 此时key已经被Datastore更新,包含自动生成的ID console.log('生成的实体ID:', key.id); // 直接用这个key查询实体 datastore.get(key).then(([entity]) => { if (entity) { console.log('查到的实体:', entity); // 这里的entity[DatastoreClient.KEY]和key是同一个对象,所以会返回true console.log('key匹配:', entity[DatastoreClient.KEY] === key); } else { console.log('未找到对应实体'); } }).catch(err => { console.error('查询出错:', err); }); });
方法二:只用ID重新构建Key查询
如果之后你没有保存原来的key对象,只有生成的ID值,那可以重新构建一个包含ID的key来查询:
const kind = '你的实体类型'; const generatedId = 123456; // 替换成实际生成的ID(注意是数字类型) // 用kind+ID构建key const targetKey = datastore.key([kind, generatedId]); // 调用get查询 datastore.get(targetKey).then(([entity]) => { if (entity) { console.log('查到的实体:', entity); } else { console.log('未找到对应ID的实体'); } }).catch(err => { console.error('查询出错:', err); });
方法三:用查询语句(createQuery)通过ID查询
如果你想用查询语句来筛选,需要通过__key__过滤器匹配带ID的key,注意不要像你代码里那样用datastore.key(kind)(这是一个没有ID的key,查不到任何实体),要构建包含ID的key:
const kind = '你的实体类型'; // 用save后更新的key,或者重新构建的带ID的key const targetKey = key; // 这里的key是save后包含ID的那个key const query = datastore.createQuery(kind) .filter('__key__', '=', targetKey); datastore.runQuery(query).then(([entities]) => { if (entities.length > 0) { console.log('查到的实体:', entities[0]); } else { console.log('未找到对应ID的实体'); } }).catch(err => { console.error('查询出错:', err); });
注意事项
- 自动生成的ID是数字类型,不要把它转成字符串使用,否则会匹配不到实体
- 确保构建key时的
kind和保存实体时的kind完全一致,大小写也要匹配
内容的提问来源于stack exchange,提问作者Salathiel Genese
相关产品推荐
相关产品推荐

