将侦听器附加到任何 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。
我的文档结构为:
/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。