簡體   English   中英

Firestore 查詢具有相似數組的文檔(Node.js/Admin 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM