Google Datastore投影查询复杂对象数组

时间:2019-11-04 20:29:22

标签: google-cloud-platform google-cloud-firestore google-cloud-datastore datastore

我有一个简单的数据存储类型,具有以下属性:

  • id(长)
  • createdAt(时间戳)
  • userId(字符串)
  • 指标(复杂对象的数组)
    • 指标类型
    • 指标值

数据存储区中的每个存储行可能具有不同数量的指标以及不同类型的指标。

我有一个非常具体的要求来查询用户的最新指标。这里的问题是,不同的行具有不同的指标,因此我不能只取最近的行,而是需要查看指标数组以检索所有数据。

我决定使用投影查询。我的想法是根据以下属性创建投影:metrics.typemetrics.value,并在metrics.type上使用distance,并按createdAt desc的顺序添加顺序。

为获得更好的解释,下面是数据存储区中行的简单示例:

1. { "id": 111, "createdAt": "2019-01-01 00:00", "userId" : "user-123", [{ "type" : "metric1", "value" : 123 }, { "type" : "metric2", "value" : 345 }] }
2. { "id": 222, "createdAt": "2019-01-02 00:00", "userId" : "user-123", [{ "type" : "metric3", "value" : 567 }, { "type" : "metric4", "value" : 789 }] }

我希望在metrics.type过滤器上使用不重复的投影查询会返回以下结果:

1. "metric1", 123
2. "metric2", 345
3. "metric3", 567
4. "metric4", 789

但实际上查询返回的内容是:

1. "metric1", 123
2. "metric2", 123
3. "metric3", 123
4. "metric4", 123

因此所有指标都具有相同的值(这是不正确的)。基本上是因为索引爆炸而发生的-数据存储区认为我有2个数组,但实际上它是单个数组

有什么方法可以使投影查询返回我期望的结果,而不是分解索引?如果没有,我该如何重建我拥有的东西,使其符合我的要求?

1 个答案:

答案 0 :(得分:1)

Cloud Datastore文档专门警告您的确切问题。

https://cloud.google.com/datastore/docs/concepts/queries#projections_and_array-valued_properties

解决此问题的一种方法是将类型和值结合在一起。因此,拥有一个名为“ metric”的属性,该属性的值将类似于“ metric1:123”,“ metric2:345”。然后,您将投影一个数组值属性。