Google.Cloud.Datastore.V1中的密钥是什么

时间:2018-06-20 06:10:59

标签: c# google-cloud-platform google-cloud-datastore

我是这个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"
    }]
}

在这里,我总结一下我的问题:

  1. 密钥类的用途是什么?
  2. Key的路径是什么,为什么是数组?
  3. id是实体的唯一密钥吗?
  4. 如何通过QueryKeyId

感谢您的阅读,请不要介意我的英语不好。

1 个答案:

答案 0 :(得分:2)

键是文档的唯一标识符。 documentation说得最好:

  

Cloud Datastore中的每个实体都有一个唯一标识它的 key 。密钥包含以下组件:

     
      
  • 实体的命名空间,允许多租户
  •   
  • 实体的种类,出于Cloud Datastore查询的目的对其进行了分类
  •   
  • 单个实体的标识符,可以是      
        
    • 键名字符串
    •   
    • 整数数字ID
    •   
  •   
  • 可选的祖先路径,用于在Cloud Datastore层次结构中定位实体   可选的祖先路径,用于在Cloud Datastore层次结构中定位实体
  •   

“祖先路径”部分是Path属性中存在数组的原因-完全限定键是名称空间,后跟一系列path elements,每个序列都由一个种类和“整数ID”或“字符串名称”部分。

例如,您可能有一个图书馆应用程序。那有架子和书本。忽略名称空间部分,特定的书可能具有一个包含以下路径元素的ID:

  • 种类=货架; Id = 1(数字ID)
  • Kind = Book;名称= xyz(字符串名称)

对此的另一种思考方式是集合和文档名称的交替序列,例如“ / shelves / 1 / books / xyz”。这就是Firestore表示其文档ID的方式。

任何一个路径元素都不必是唯一的,但是完整的路径是唯一的。按“键和ID”进行查询没有真正的概念-您可以查找完整的键(例如DatastoreDb.Lookup)或包含父键作为祖先路径查询。