/ / Mongoose.js और Regexp के साथ क्वेरी ऑब्जेक्ट - जावास्क्रिप्ट, regex, node.js, mongodb, mongoose

Mongoose.js और Regexp के साथ क्वेरी ऑब्जेक्ट - जावास्क्रिप्ट, regex, node.js, mongodb, mongoose

एक खोज इंजन में, एक लोकोमोटिव ऐप मेंमेरे मॉडल (बल्कि विशिष्ट मेटाडेटा के साथ जो मैंने जीता है "सामान्य कारणों से यहां नहीं जाता है) मुझे कीवर्ड फ़ील्ड के विरुद्ध जांच करने के लिए एक regexp इंजन शामिल करने की आवश्यकता है।

मेरा दृष्टिकोण इस प्रकार है:

this.keywords = strings.makeSafe(this.param("keywords")).toLowerCase();
console.log(this.keywords);
if(strings.exists(this.keywords)) {
keywords = this.keywords.split(", ");
var len = keywords.length - 1;
do {
query.regex("/" + this.keywords[len] + "/ig", "keywords");
} while(len--);
}

(यह एस। पासवर्ड है ताकि मैं इसे उस दृश्य तक पहुंचा सकूं, जिसकी मुझे आवश्यकता है)।

हालाँकि, मैं उन डेटा का मिलान नहीं कर रहा हूँ जिन्हें मैं संग्रह में दस्तावेजों में उपलब्ध होना जानता हूँ

the strings.makesafe कॉल बस यह करता है:

strings.makeSafe = function(str) {
str = String(str);
var re = /$/gi;
str =  str.replace(re, "U+FF04");
re = /./gi;
return str.replace(re, "U+FF08");
};

और के माध्यम से कोड इंजेक्शन के लिए मंगोल "s भेद्यता के साथ सौदा करने के लिए एक प्रयास है "."और "$" वर्ण. यह परीक्षण किया गया है और इस मुद्दे ड्राइविंग नहीं होना चाहिए.

मैं मन की हूँ अभी है कि यह कुछ regexp या बुला विधि की संरचना के साथ क्या करना है.यह मंगोलों में कीवर्ड की अल्पविराम अलग सूची पर एक खोज को पूरा करने के लिए सही वाक्यविन्यास है.

उत्तर:

जवाब के लिए 2 № 1

आपके दृष्टिकोण के साथ कुछ समस्याएं हैं:

  1. ऐसा मानते हुए query एक नेवला है Query ऑब्जेक्ट, आप "के लिए मापदंडों के लिए बदली आदेश मिल गया है regex पथ के रूप में विधि पहले आती है, फिर रेमेक्स मूल्य।
  2. आप का उपयोग कर नियमित रूप से अभिव्यक्ति का निर्माण करने की जरूरत है RegExp निर्माता के साथ शाब्दिक नोटेशन के रूप में कार्य / चार "टी गतिशील तार से बनाया जा सकता है।
  3. कॉलिंग query.regex इस तरह एक पाश में "टी या शर्तों को एक साथ करता है क्योंकि प्रत्येक कॉल बस पिछले एक ओवरराइट करता है।इसके बजाय, आप कीवर्ड को एक संयुक्त रेगेक्स में एक साथ जोड़ सकते हैं जो उनमें से किसी से मेल खाता है |.

यह सब एक साथ लाना यह कुछ ऐसा होना चाहिए:

this.keywords = strings.makeSafe(this.param("keywords")).toLowerCase();
console.log(this.keywords);
if (strings.exists(this.keywords)) {
keywords = this.keywords.split(", ");
query.regex("keywords", new RegExp(keywords.join("|"), "i"));
}