फायरस्टार क्वेरी समान एरे के साथ दस्तावेज (Node.js / व्यवस्थापक SDK)

Aug 16 2020

कल्पना कीजिए कि आपके पास यह सरणी है

[10.3, 14, 12.4, 3.5]

और आपके DB में आपके पास उन सरणियों के साथ दो दस्तावेज़ भी हैं:

First document -> [10, 13.1, 0, -10]
Second document -> [0, 0, 0, 0]

अब कल्पना करें कि आपके पास एक ही दो सरणियों (प्रत्येक के बीच बारी-बारी से) के साथ +1000000 दस्तावेज हैं ... क्या सभी दस्तावेजों को प्राप्त करने का कोई तरीका है जो आपके वर्तमान सरणी के समान समान हैं?

मेरा मतलब है, कुछ इस तरह:

   ...
   .where("array", "isSimilar", yourArray)
   .get()

ताकि मुझे सभी दस्तावेज मिलें जिनके पास सरणी है:

[10, 13.1, 0, -10]

या हर एक दस्तावेज़ को डाउनलोड करने का एकमात्र तरीका है, ऐसा कुछ जो वास्तव में धीमा हो सकता है, और फिर सबसे समान है? मुझे लगता है कि "समान बिंदुओं वाले पदों" के बारे में बात करते समय यह वास्तव में दिलचस्प हो सकता है, "सप्ताह जिसमें एक उपयोगकर्ता ने समान वजन कम किया है", ...

धन्यवाद।

जवाब

3 JayCodist Aug 16 2020 at 09:20

फिलहाल, फायरस्टार उस तरह के क्वेरी का समर्थन नहीं करता है। इसलिए मेरा सुझाव है कि आप अपनी संरचना को सरणी तुलना के लिए स्ट्रिंग फ़ील्ड शामिल करने के लिए अपडेट करें। तो प्रत्येक दस्तावेज इस तरह दिखेगा:

{
   array: [12, 11, 8, 9],
   arrayStr: "12,11,8,9",
   ...
}

आप doc.array.join(",")सभी मौजूदा दस्तावेज़ों पर कॉल करके और दस्तावेज़ के मूल्य को सहेजकर इस संरचना को प्राप्त कर सकते हैं ।

फिर, फायरस्टार क्वेरी के साथ तुलना करना संभव होगा, जैसे:

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()तुलना के लिए सहिष्णुता के स्तर को बढ़ाने या कम करने के लिए पारित तर्क को भिन्न कर सकते हैं