[英]Firebase-admin Firestore node.js share logic with modular v9 js sdk
[英]Firestore Query Documents With Similar Array (Node.js/Admin SDK)
想象一下你有這個數組
[10.3, 14, 12.4, 3.5]
在您的數據庫中,您還有兩個帶有 arrays 的文檔:
First document -> [10, 13.1, 0, -10]
Second document -> [0, 0, 0, 0]
現在想象一下,您有 +1000000 個具有相同兩個 arrays 的文檔(在每個文檔之間交替)...有沒有辦法獲取與當前數組具有相似值的所有文檔?
我的意思是,像這樣:
...
.where("array", "isSimilar", yourArray)
.get()
這樣我就得到了所有具有數組的文檔:
[10, 13.1, 0, -10]
或者唯一的方法是下載每個文檔,這可能真的很慢,然后迭代並搜索最相似的? 我認為在談論“相似點位置”、“用戶減輕相似體重的周數”時,這可能真的很有趣,......
謝謝。
目前,firestore 不支持這種查詢。 因此,我建議您更新結構以包含用於數組比較的字符串字段。 所以每個文檔看起來像這樣:
{
array: [12, 11, 8, 9],
arrayStr: "12,11,8,9",
...
}
您可以簡單地通過在所有現有文檔上調用doc.array.join(",")
並將值保存到文檔中來實現此結構。
然后,就可以與 firestore 查詢進行比較,如下所示:
const arrToCompare = [12, 11, 8, 9];
const snapshot = await firestore().collection(collection).where("arrayStr", "==", arrToCompare.join(",")).get();
...
更新:要通過相似性而不是相等性進行比較,一種可能的方法是在創建期間將“相似性”邏輯應用於arrayStr
字段。 例如,如果您希望允許小於 0.5 的差異,則可以在保存為字符串之前對數組元素使用Math.round()
。 像這樣:
const array = [12.2, 10.7, 8.111, 9.0];
const arrayStr = array.map(num => Math.round(num)).join(","); //"12,11,8,9"
然后你會這樣查詢:
const arrToCompare = [12, 11, 8, 9];
const snapshot = await firestore().collection(collection).where("arrayStr", "==", arrToCompare.map(num => Math.round(num)).join(",")).get();
// Results would include arrays like [12.2, 10.7, 8.111, 9.0]
...
當然,您可以更改傳遞給Math.round()
的參數,以增加或降低比較的容忍度
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.