javascript - क्लाउड फायरस्टार केस इनसेटिव क्वेरी का उपयोग करके छंटनी




firebase google-cloud-firestore (2)

मैंने ऑर्डरबाय का उपयोग करके क्लाउड फायरस्टार से सॉर्ट किए गए डेटा को पढ़ने की कोशिश की। और फायरस्टार ने निम्नलिखित आदेश के रूप में डेटा लौटाया:

एएए
बीबीबी
aaa
bbb

अब, मुझे जो चाहिए वो कुछ इस प्रकार है:

एएए
aaa
बीबीबी
bbb

मैं इस परिणाम को केवल क्रमबद्ध तरीके से नहीं बल्कि क्रमबद्धता के प्रयोग से चाहता हूँ।
क्या फायरस्टार में इस तरह से छांटने का कोई तरीका है?


कृपया मुझे इसके लिए एक समाधान प्रदान करें।

अग्रिम में धन्यवाद।


अपने परिणाम प्राप्त करने के बाद आप इसे मैन्युअल रूप से भी कर सकते हैं:

docArray.sort((a, b) => {
  if (a.myData.toLowerCase() < b.myData.toLowerCase()) {
    return -1;
  }
  if (a.myData.toLowerCase() > b.myData.toLowerCase()) {
    return 1;
  }
  return 0;
});

क्लाउड फायरस्टार में छंटनी मामला संवेदनशील है। मामले की अनदेखी करने के लिए कोई झंडा नहीं है।

अपने उपयोग-मामले को प्राप्त करने का एकमात्र तरीका फ़ील्ड को दो बार संग्रहीत करना है।

मान लीजिए कि आपका फ़ील्ड 'AAA' और 'aaa' को संग्रहीत करता है, जिसे myData कहा जाता है। आपके ग्राहक कोड में आपको myData_insensitive नामक एक दूसरे फ़ील्ड को संग्रहीत करने की आवश्यकता होगी जहां आप डेटा की केस-असंवेदनशील प्रतिलिपि संग्रहीत करते हैं।

DocA:
-> myData = 'AAA'
-> myData_insensitive = 'AAA'

DocB:
-> myData = 'aaa'
-> myData_insensitive = 'AAA'

DocC:
-> myData = 'BBB'
-> myData_insensitive = 'BBB'

DocD:
-> myData = 'bbb'
-> myData_insensitive = 'BBB'

अब आप myData_insensitive द्वारा क्वेरी और / या ऑर्डर कर सकते हैं, लेकिन myData प्रदर्शित कर सकते हैं।

इस क्षेत्र के बारे में दो दिलचस्प बातें हैं:

  1. यूनिकोड के साथ, केस हटाना 'toLowerCase' की तुलना में अधिक जटिल है
  2. अलग-अलग मानव भाषाएं समान वर्णों को अलग-अलग प्रकार से क्रमबद्ध करेंगी

हल करने के लिए प्रत्येक कोलाजेशन के लिए अलग-अलग इंडेक्स बनाए बिना (2), केस फोल्डिंग के माध्यम से (1) से निपटने के लिए एक कार्यान्वयन दृष्टिकोण। यदि आप केवल आधुनिक ब्राउज़र संस्करणों का समर्थन करना चाहते हैं, तो निम्नलिखित आपको एक जावास्क्रिप्ट उदाहरण देता है:

caseFoldNormalize = function (s){
  return s.normalize('NFKC').toLowerCase().toUpperCase().toLowerCase()
};
caseFoldDoc = function(doc, field_options) {
  // Case fold desired document fields
  if (field_options != null) {
    for (var field in field_options) {
      if (field_options.hasOwnProperty(field)) {
        switch(field_options[field]) {
          case 'case_fold':
            if (doc.hasOwnProperty(field) && Object.prototype.toString.call(doc[field]) === "[object String]") {
              doc[field.concat("_insensitive")] = caseFoldNormalize(doc[field])
            }
            break;
        }
      }
    }
  }
  return doc;
}

var raw_document = {
  name: "Los Angeles",
  state: "CA",
  country: "USA",
  structure: 'Waſſerſchloß',
  message: 'quıt quit' // Notice the different i's
};

var field_options = {
  name: 'case_fold',
  country: 'case_fold',
  structure: 'case_fold',
  message: 'case_fold'
}

var firestore_document = caseFoldDoc(raw_document, field_options);

db.collection("cities").doc("LA").set(firestore_document).then(function() {
  console.log("Document successfully written!");
}).catch(function(error) {
  console.error("Error writing document: ", error);
});

यह आपको निम्नलिखित क्षेत्रों के साथ क्लाउड फायरस्टार में एक दस्तावेज देगा:

{ 
 "name": "Los Angeles", 
 "state": "CA", 
 "country": "USA", 
 "structure": "Waſſerſchloß", 
 "message": "quıt quit", 
 "name_casefold": "los angeles", 
 "country_casefold": "usa", 
 "structure_casefold": "wasserschloss", 
 "message_casefold": "quit quit"
}

पुराने ब्राउज़र को संभालने के लिए, आप एक समाधान देख सकते हैं कि मैं कैसे करें toLowerCase () और toUpperCase () ब्राउज़रों से संगत





google-cloud-firestore