将侦听器附加到任何 Firestore 收集更改

Attach listener to any Firestore collect change

我的文档结构为:

/uploads/${USER_ID}/items/${UUID}

我可以成功侦听路径末尾文档的变化,例如

firestore
    .collection("uploads")
    .document(configService.getUserId())
    .collection("items")
    .whereEqualTo("owner", configService.getUserId())
    .addSnapshotListener(this::onEvent);
}

但是我如何才能监听 /uploads/* 上的所有更改而不遍历所有附加监听器的文档(看起来效率很低)?

我天真地试过了

firestore
    .collection("uploads")
    .addSnapshotListener(this::onEvent);
}

但是,当沿着路径进行更改时它不会被触发。

您要找的是 collection group query。有了它,您可以通过以下方式收听所有 items 个子集合中的所有文档:

final Query items = db.collectionGroup("items").whereEqualTo("owner", configService.getUserId());
final ApiFuture<QuerySnapshot> querySnapshot = items.get();
for (DocumentSnapshot document : querySnapshot.get().getDocuments()) {
  System.out.println(document.getId());
}

如果您需要知道特定项目属于哪个上传,您可以从那里调用 document.getReference() to get a reference to the item document, and then follow the getParent trail