![](/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.