如果要在将文档保存到Firestore之前(不编写自定义代码)之前知道文档的(随机)ID,我可以执行以下操作:
String id = db.collection("collection-name").document().getId();
如果我在上面的代码中给"collection-name"
但使用那个id
将文档保存到集合"some-other-collection"
,会有所不同吗?
换句话说,集合名称(或更笼统地说,是文档的路径)与Firestore生成的随机ID有什么关系吗?
生成的Firestore ID是否类似于The 2^120 Ways to Ensure Unique Identifiers中所述?
以下代码对于为Firestore文档自动生成已知ID有多好?
private static SecureRandom RANDOMIZER = new SecureRandom();
.
.
.
byte[] randomId = new byte[120];
RANDOMIZER.nextBytes(randomId);
// Base64-encode randomId
答案 0 :(得分:1)
Cloud Firestore生成的文档ID是在客户端生成的,完全是随机的,并且与生成它们的集合无关。
如果您深入研究(开放源代码)SDK,则可以自己看到。例如,在Android SDK中,这是source for CollectionReference.add()
:
final DocumentReference ref = document();
return ref.set(data)
因此,将ID生成留给了document
method:
public DocumentReference document() {
return document(Util.autoId());
}
Util.autoId()
的代表:
private static final int AUTO_ID_LENGTH = 20;
private static final String AUTO_ID_ALPHABET =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final Random rand = new Random();
public static String autoId() {
StringBuilder builder = new StringBuilder();
int maxRandom = AUTO_ID_ALPHABET.length();
for (int i = 0; i < AUTO_ID_LENGTH; i++) {
builder.append(AUTO_ID_ALPHABET.charAt(rand.nextInt(maxRandom)));
}
return builder.toString();
}
如前所述:具有足够熵的纯客户端随机性,以确保全局唯一性。