【发布时间】:2018-12-21 18:42:14
【问题描述】:
我有一个名为 Products 的集合和另一个名为 Category 的集合。
Products 文档有一个字段 idCategory,引用类别的 ID。
我想从Products 获取类别名称等于“Soda”的所有文档。
我该怎么做?
【问题讨论】:
标签: java android firebase google-cloud-firestore
我有一个名为 Products 的集合和另一个名为 Category 的集合。
Products 文档有一个字段 idCategory,引用类别的 ID。
我想从Products 获取类别名称等于“Soda”的所有文档。
我该怎么做?
【问题讨论】:
标签: java android firebase google-cloud-firestore
我想从 Products 中获取类别名称等于“Soda”的所有文档。
因为您没有在一个文档中包含所有数据,所以您需要查询您的数据库两次。在这种情况下,一次获取类别的 ID,即“Soda”,然后根据该 ID 获取相应的产品。这是因为 Firestore 不支持跨多个集合的查询。单个查询只能使用单个集合中文档的属性。
为什么要查询数据库两次,当您可以查询一次并获得所需的文档时,成本也很高。为此,您需要对数据库模式进行一些更改。由于单个产品可能属于多个类别,因此您的新架构应如下所示:
Firestore-root
|
--- products (collection)
|
--- productId (document)
|
--- productName: "Soda Water"
|
--- category: ["Soda", "Other Category"]
|
--- //Other properties
要获取不属于Soda 类别的所有文档,请使用以下代码行:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference productsRef = rootRef.collection("products");
Query query = productsRef.whereArrayContains("category", "Soda");
编辑:您还可以保留引用而不是仅保留 id,但为此,请参阅我在此 post 中的回答。
【讨论】:
.collection(“Category”).document(“Soda”).collection(“Products”) 时会发生什么?
Products 子集合中的所有文档。
看起来你会做一个简单的查询(Firebase Docs Reference):
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference productsRef = db.collection("Products");
Query query = productsRef.whereEqualTo("idCategory", "Soda");
query.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
/// do things with response
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
/// do things with error
});
【讨论】:
Soda 不是 Category 的 id 属性