【发布时间】:2019-07-03 04:44:34
【问题描述】:
我想编写一个查询,该查询可以获取联系人在任何数组索引中的 id=1 的所有文档。
我已经检查了 array_contains 操作员的 firestore,但问题是我的数组有地图,然后有字段 id。
谢谢
【问题讨论】:
-
您知道如何查询 id/name 级别的属性吗?我遇到了同样的问题。
标签: firebase google-cloud-firestore
我想编写一个查询,该查询可以获取联系人在任何数组索引中的 id=1 的所有文档。
我已经检查了 array_contains 操作员的 firestore,但问题是我的数组有地图,然后有字段 id。
谢谢
【问题讨论】:
标签: firebase google-cloud-firestore
您目前无法构建在数组中查找对象字段的查询。您可以在数组中找到的唯一内容是数组元素的全部内容,而不是元素的一部分。
对于 NoSQL 类型的数据库,通常的做法是以适合您查询的方式构建数据。因此,在您的情况下,您将不得不构造数据以让您找到数组项包含特定字符串的文档。因此,您可以创建另一个仅包含您要查询的字符串的数组。您必须确保这些数组保持最新。
您也可以在这里重新考虑使用数组。数组适用于位置数据,但除非这些联系人需要按特定顺序存储,否则您可能希望存储一个其键为 id 且其字段数据还包含 id 和名称的对象。
【讨论】:
正如道格所说,你不能查询它, 但是,如果您可以将数据结构化为类似于this
id 作为键,name 作为值id=1的所有文档
db.collection("test").where("contacts.1", ">=", "").get()
【讨论】:
正如@Doug 所说,One soulions 将数组添加到您需要查询的数据中,并使其保持最新状态。
另一种解决方案是将联系人作为文档的子集合,然后您可以查询联系人并获取其父级。
final Query contacts = db.collectionGroup("contacts").whereEqualTo("id", 1);
for (DocumentSnapshot document : querySnapshot.get().getDocuments()) {
System.out.println(document.getId());
System.out.println(document.getString("parent_id"));
}
如果您不想将父级添加为另一个字段,可以从父级参考中获取,查看此答案https://stackoverflow.com/a/56223319/1278463
snapshot.getRef().getParent().getParent().collection("people")
https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query
【讨论】:
如果您有一组地图或对象,并且想要像这样获取包含此特定地图/对象的文档? array_of_maps.png
你可以使用
queryForCategory(categName: string, categAlias: string): Observable[] {
firestore.collection('<Collection name>', ref =>
ref.where('categories',
"array-contains", {
"alias": categAlias,
"title": categName
}
【讨论】: