![](/img/trans.png)
[英]What's the best way (most efficient) to turn all the keys of an object to lower case?
[英]What is the most efficient firestore model for this use case?
在我的應用程序中,我目前有三個集合:
db_contacts
Firestore-root
|
--- db_contacts (collection)
|
--- phoneNumber (document)
|
--- 'phone': phoneNumber
db_contacts包含我在 head 之前添加的手機列表。 該集合稍后將包含大約 100 萬個電話號碼。 目前它只有 50,000 個電話號碼(50,000 個文件)。
users_contacts
Firestore-root
|
--- users_contacts (collection)
|
--- uid (document)
|
--- contacts (subcollection)
|
--- phoneNumberOfContact (document)
|
--- 'phone': phoneNumberOfContact
users_contacts保存了我的應用程序上每個用戶的所有電話號碼。 該應用程序將被大約 10,000 名用戶使用,每個用戶擁有約 500 個聯系人。 所以我將有 10,000 個 uid 文檔,每個都有 ~500 個 phoneNumberOfContact 文檔在聯系人子集合中。
users_common_contacts
Firestore-root
|
--- users_common_contacts (collection)
|
--- uid (document)
|
--- contacts (subcollection)
|
--- phoneNumberOfContact (document)
|
--- 'phone': phoneNumberOfContact
users_common_contacts包含用戶已經在db_contacts中的聯系人。 我在 users_contacts onWrite 上設置的事件掛鈎上填充此集合。
我需要創建一個額外的集合,用於存儲 users_common_contacts 中用戶的唯一聯系人。 只有該用戶的聯系人與 db_contacts 有哪些共同點,而其他用戶沒有。
到目前為止我所做的,結果證明是一個錯誤如下:
users_unique_contacts
Firestore-root
|
--- users_unique_contacts (collection)
|
--- uid (document)
|
--- contacts (subcollection)
|
--- phoneNumberOfContact (document)
|
--- 'phone': phoneNumberOfContact
我無法正確填充此表,因為無法找到單個用戶的唯一聯系人。 我用於填充users_unique_contacts 的代碼如下:
exports.userCommonContactsListener =
functions.firestore.document('users_common_contacts/{userID}/contacts/{documentID}')
.onCreate((snap, context) => {
const DocumentID = context.params.documentID;
const UserID = context.params.userID;
const uniqueContactsRef = admin.firestore().collection('users_unique_contacts').doc(UserID).collection("contacts");
return new Promise((resolve, reject) => {
uniqueContactsRef.where('phone', '==', DocumentID).get().then(contactSnapshot => {
if (contactSnapshot.size > 0) {
console.log(`Found Common Number in Unique ${contactSnapshot}`);
contactSnapshot.forEach(documentSnapshot => {
documentSnapshot.ref.delete();
console.log(`Deleted ${documentSnapshot.ref.id} as unique contact`);
resolve(`Deleted ${documentSnapshot.ref.id} as unique contact`);
});
} else {
var db_contacts = {}
db_contacts['phone'] = DocumentID;
db_contacts['timestamp'] = new Date();
uniqueContactsRef.doc(DocumentID).set(db_contacts, { merge: true }).then((res) => {
console.log(`Added ${DocumentID} as unique contact`);
resolve(`Added ${DocumentID} as unique contact`);
}).catch((err) => {
console.log(err);
reject("Error Removing Unique Contact", err);
});;
}
});
});
});
代碼不起作用, uniqueContactsRef.where('phone', '==', DocumentID).get()
永遠不會返回任何值。
我怎樣才能對我的users_unique_contacts進行建模?
我的意思是: “我需要創建一個額外的集合,用於存儲 users_common_contacts 內用戶的唯一聯系人。只有該用戶與 db_contacts 有哪些共同點,而其他用戶沒有。”
假設 db_contacts 有以下數字:
用戶 A與 db_contacts 有以下共同點:
用戶 B與 db_contacts 有以下共同點:
現在,用戶 A是唯一擁有以下數字的用戶:
現在,用戶 B是唯一擁有以下數字的用戶:
所以用戶 A的唯一編號是:
所以用戶 B的唯一編號是:
由於db_contacts
集合已經包含了所有用戶的所有電話號碼,因此您不需要將用戶電話號碼的唯一性與db_contacts
集合中存在的號碼進行比較,您需要檢查用戶的號碼是否存在於其他用戶中聯系人列表。 換句話說,您需要檢查一個號碼與其他用戶聯系人相比是否唯一。 因此,您需要獲取用戶擁有的每個號碼並檢查它是否存在於其他用戶聯系人列表中。 在這種情況下,您應該通過添加如下新集合來稍微更改數據庫架構:
Firestore-root
|
--- allUsersNumbers (collection)
|
--- uid (document)
|
--- phoneNumbers (map)
|
--- phoneNumberOne: true
|
--- phoneNumberTwo: true
看, uid
文檔現在只包含一個地圖,因此它可以容納 1MiB,這是文檔的最大大小。 您的查詢應如下所示:
allUsersNumbersRef.where('phoneNumbers.searchedPhoneNumber', '==', true);
現在你只需要獲取數據。 如果snapshot
存在則表示它不是唯一的,如果不存在則表示它是唯一的。 如果需要,您還可以將這些數字存儲在數組中。 因此,由您決定哪種解決方案更適合您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.