firebase Firestore:如何从数组Map中查询数据

v09wglhw  于 2022-11-17  发布在  其他
关注(0)|答案(4)|浏览(185)

下面是测试数据库的模式:

我想写一个查询,它可以获取所有文档,其中联系人在任何数组索引中的id=1。
我已经检查了firestore的array_contains操作符,但问题是我的数组有map,然后有字段id。
谢谢

nr7wwzry

nr7wwzry1#

目前无法建立在数组中查找对象字段的查询。在数组中只能找到数组元素的全部内容,而不能找到元素的一部分。
对于NoSQL类型的数据库,通常的做法是以适合查询的方式组织数据。因此,在您的情况下,您必须组织数据,以便查找数组项包含特定字符串的文档。因此,您可以创建另一个数组,其中只包含您要查询的字符串。您必须确保这些数组是最新的。
你也可以重新考虑数组的使用。数组对于位置数据是很好的,但是除非这些联系人需要以特定的顺序存储,否则你可能希望存储一个对象,其键是id,其字段数据也包含id和name。

uxhixvfz

uxhixvfz2#

正如Doug所说,您无法查询它,但是,如果您可以将数据结构化为类似this的内容
1.将数据存储为Map
1.使用id作为键,使用name作为值
1.现在,您可以编写一个查询来获取联系人具有id=1的所有文档

db.collection("test").where("contacts.1", ">=", "").get()
jmp7cifd

jmp7cifd3#

其中一个方法是像@Doug说的那样,将需要查询的数据添加到数组中,并使其保持最新。

另一个解决方案是将联系人作为文档的子集合,然后您可以查询联系人并获取其父集合。

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

gudnpqoy

gudnpqoy4#

如果您有一个Map或对象数组,并希望获取包含此特定Map/对象的文档,如下所示?array_of_maps.png
您可以使用

queryForCategory(categName: string, categAlias: string): Observable[] {
    firestore.collection('<Collection name>', ref =>

        ref.where('categories',
          "array-contains", {
            "alias": categAlias,
            "title": categName
          }

相关问题