我是这个nuget包的新手,并与 Key 类混淆。
这是我基于Google.Cloud.Datastore.V1文档的代码:
public long InsertMessage<T>(T iEntity) where T : IEntity<T>
{
var keyFactory = _db.CreateKeyFactory(Kind);
var entity = iEntity.ToEntity();
entity.Key = keyFactory.CreateIncompleteKey();
using (var transaction = _db.BeginTransaction())
{
transaction.Insert(entity);
var commitResponse = transaction.Commit();
var insertedKey = commitResponse.MutationResults[0].Key;
Logger.Info($"Inserted key: {insertedKey}");
return insertedKey.Path[0].Id;
}
}
我要做的就是创建一个实体并创建一个不完整的密钥,发送给服务器,然后从服务器取回填充的密钥。
我认为密钥被用作实体的唯一身份。
如果有误会,请纠正我。
我可以通过查询获取实体,如下所示:
var query = new Query(Kind)
{
Filter = Filter.Equal("key", key),
Order = { { "created", PropertyOrder.Types.Direction.Ascending } }
};
foreach (var entity in _db.RunQueryLazily(query))
{
list.Add(entity);
}
但是我不知道如何使用插入Filter.Equal("key", key)
来获得唯一实体时获得的密钥。
该示例显示键的结构为:
{
"partitionId":
{
"projectId": "projectId",
"namespaceId": "namespaceId"
},
"path": [
{
"kind": "kind",
"id": "id"
}]
}
在这里,我总结一下我的问题:
id
是实体的唯一密钥吗?Query
和Key
来Id
?感谢您的阅读,请不要介意我的英语不好。
答案 0 :(得分:2)
键是文档的唯一标识符。 documentation说得最好:
Cloud Datastore中的每个实体都有一个唯一标识它的 key 。密钥包含以下组件:
- 实体的命名空间,允许多租户
- 实体的种类,出于Cloud Datastore查询的目的对其进行了分类
- 单个实体的标识符,可以是
- 键名字符串
- 整数数字ID
- 可选的祖先路径,用于在Cloud Datastore层次结构中定位实体 可选的祖先路径,用于在Cloud Datastore层次结构中定位实体
“祖先路径”部分是Path
属性中存在数组的原因-完全限定键是名称空间,后跟一系列path elements,每个序列都由一个种类和“整数ID”或“字符串名称”部分。
例如,您可能有一个图书馆应用程序。那有架子和书本。忽略名称空间部分,特定的书可能具有一个包含以下路径元素的ID:
对此的另一种思考方式是集合和文档名称的交替序列,例如“ / shelves / 1 / books / xyz”。这就是Firestore表示其文档ID的方式。
任何一个路径元素都不必是唯一的,但是完整的路径是唯一的。按“键和ID”进行查询没有真正的概念-您可以查找完整的键(例如DatastoreDb.Lookup
)或包含父键作为祖先路径查询。