我的 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)
谢谢。
最佳答案
您正在对 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?
关于javascript - 仅从 gcloud 数据存储区的对象数组中获取选定的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606601/