【问题标题】:Get only selected object from array of objects gcloud datastore仅从对象数组 gcloud 数据存储中获取选定对象
【发布时间】:2019-05-05 12:07:53
【问题描述】:

我的 gcloud 数据存储中有这个结构

"data": {
"obj": {
"added_time": "new Date().toUTCString()",
"person_id": 13,
"places": [{
    "place_id": 12,
    "place_name": "First Place",
    "place_type": "1",
    "fruits": [{
        "id": "1",
        "name": "orange"
      },
      {
        "id": "2",
        "name": "apple"
      }
    ]
  },
  {
    "place_id": 15,
    "place_name": "secondPlace",
    "place_type": "1",
    "fruits": [{
        "id": "1",
        "name": "Grapes"
      },
      {
        "id": "2",
        "name": "Banana"
      }
    ]
  }
 ]
 }
 }
 };

我要查询added_time、person_id和place_id

这是我的综合索引

indexes:
- kind: persons
  properties:
  - name: obj.person_id
  - name: obj.added_time
  - name: obj.places.place_id

我试过这个查询

  const query = datastore
.createQuery("persons")
.filter("obj.person_id", "=", 13)
.filter("obj.places.place_id", "=", 12);

这是有效的,但它也给了我所有其他的地方。 例如,在这个查询中,我应该只得到 place_id 为 12 的地点对象,但我得到了另一个不应该出现的 place_id 为 13 的对象。

1)我怎样才能只得到一个对象?

2) 是否可以在数据存储区中使用“in”运算符,例如places.place_id in (12,13)

谢谢。

【问题讨论】:

    标签: javascript node.js google-cloud-platform google-cloud-datastore


    【解决方案1】:

    您正在对 persons 类型进行(简单)查询,因此结果将是 persons 实体,其中包括整个 places 数组。

    places 数组中只有一个位置获得persons 实体的唯一方法是执行projection query。从技术上讲,您将获得一组此类 persons 实体 - 每个匹配位置一个,但由于您还按 place_id 过滤,因此该数组将仅包含一个元素。

    您需要特别注意,因为您还需要对数组属性进行投影,请参阅Projections and array-valued properties。并且还要检查投影相关的Restrictions on queries

    不,过滤不支持IN 运算符,请参阅gcloud datastore: Can I filter with IN or Contains operator?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 2020-03-29
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多