आप जो चाहते हैं वह एक "पहलू खोज" परिणाम है जहां आप वर्तमान परिणाम सेट में मेल खाने वाले शब्दों के आंकड़े रखते हैं। इसके बाद, जबकि ऐसे उत्पाद हैं जो एक ही प्रतिक्रिया में सभी काम करने के लिए "प्रकट" होते हैं, आपको यह विचार करना होगा कि अधिकांश सामान्य भंडारण इंजनों को कई संचालन की आवश्यकता होगी।
MongoDB के साथ आप दो प्रश्नों का उपयोग स्वयं परिणाम प्राप्त करने के लिए कर सकते हैं और दूसरा पहलू जानकारी प्राप्त करने के लिए। यह समर्पित खोज इंजन उत्पादों जैसे Solr या ElasticSearch से उपलब्ध पहलू परिणामों के समान परिणाम देगा।
लेकिन इसे प्रभावी ढंग से करने के लिए, आप इसे अपने दस्तावेज़ में इस तरह शामिल करना चाहते हैं कि इसका प्रभावी ढंग से उपयोग किया जा सके। आप जो चाहते हैं उसके लिए एक बहुत प्रभावी फ़ॉर्म टोकनयुक्त डेटा की एक सरणी का उपयोग कर रहा है:
{
"otherData": "something",
"facets": [
"country:UK",
"city:London-UK",
"genre:Student"
]
}
तो "तथ्य" आपके दस्तावेज़ में एक ही फ़ील्ड है और एकाधिक स्थानों में नहीं। इससे इंडेक्स और क्वेरी करना बहुत आसान हो जाता है। फिर आप अपने परिणामों को प्रभावी ढंग से एकत्रित कर सकते हैं और प्रत्येक पहलू के लिए योग प्राप्त कर सकते हैं:
User.aggregate(
[
{ "$unwind": "$facets" },
{ "$group": {
"_id": "$facets",
"count": { "$sum": 1 }
}}
],
function(err,results) {
}
);
या अधिक आदर्श रूप से $match
. में कुछ मानदंडों के साथ :
User.aggregate(
[
{ "$match": { "facets": { "$in": ["genre:student"] } } },
{ "$unwind": "$facets" },
{ "$group": {
"_id": "$facets",
"count": { "$sum": 1 }
}}
],
function(err,results) {
}
);
अंतत:प्रतिक्रिया देना जैसे:
{ "_id": "country:FR", "count": 50 },
{ "_id": "country:UK", "count": 300 },
{ "_id": "city:London-UK", "count": 150 },
{ "_id": "genre:Student": "count": 500 }
इस तरह की संरचना को असतत "देश" और "शहर" जैसी चीजों के लिए पार करना और निरीक्षण करना आसान है जो "देश" से संबंधित है क्योंकि उस डेटा को एक हाइफ़न "-" द्वारा लगातार अलग किया जाता है।
सरणियों के भीतर दस्तावेज़ों को मैश करने का प्रयास करना एक बुरा विचार है। सम्मान के लिए 16 एमबी की एक बीएसओएन आकार सीमा भी है, जिससे एक साथ मैशिंग परिणाम (विशेष रूप से यदि आप दस्तावेज़ सामग्री रखने की कोशिश कर रहे हैं) निश्चित रूप से प्रतिक्रिया में पार होने जा रहे हैं।
ऐसी क्वेरी से परिणामों की "समग्र गणना" प्राप्त करने जैसी सरल चीज़ के लिए, फिर किसी विशेष पहलू प्रकार के तत्वों का योग करें। या बस अपनी वही क्वेरी तर्क .count()
. पर जारी करें ऑपरेशन:
User.count({ "facets": { "$in": ["genre:Student"] } },function(err,count) {
});
जैसा कि यहां कहा गया है, विशेष रूप से परिणामों के "पेजिंग" को लागू करते समय, "परिणाम गणना", "पहलू गणना" और वास्तविक "परिणामों का पृष्ठ" प्राप्त करने की भूमिकाएं सर्वर को "अलग" प्रश्नों को सौंप दी जाती हैं।
उन प्रश्नों में से प्रत्येक को समानांतर में सर्वर पर सबमिट करने और फिर अपने टेम्पलेट या एप्लिकेशन को फ़ीड करने के लिए एक संरचना को संयोजित करने में कुछ भी गलत नहीं है, जो इस तरह की प्रतिक्रिया प्रदान करने वाले खोज इंजन उत्पादों में से एक से पहलू खोज परिणाम की तरह दिखता है।पी>
समाप्त हो रहा है
इसलिए पहलुओं को एक ही स्थान पर चिह्नित करने के लिए अपने दस्तावेज़ में कुछ डालें। इस उद्देश्य के लिए टोकनयुक्त स्ट्रिंग्स की एक सरणी अच्छी तरह से काम करती है। यह $in
. जैसे क्वेरी फ़ॉर्म के साथ भी अच्छा काम करता है और $all
पहलू चयन संयोजनों पर या तो "या" या "और" शर्तों के लिए।
केवल कुछ कथित पदानुक्रमित संरचना से मेल खाने के लिए परिणामों या घोंसले के जोड़ों को मैश करने का प्रयास न करें, बल्कि प्राप्त परिणामों को पार करें और टोकन में सरल पैटर्न का उपयोग करें। यह बहुत आसान है
सामग्री के लिए पृष्ठांकित प्रश्नों को अलग-अलग प्रश्नों के रूप में या तो पहलुओं या समग्र गणनाओं के लिए चलाएँ। सभी सामग्री को सरणियों में धकेलने की कोशिश करना और फिर केवल गणना प्राप्त करने के लिए सीमित करना समझ में नहीं आता है। वही काम करने के लिए आरडीबीएमएस समाधान पर भी यही लागू होगा, जहां पेजिंग परिणाम मायने रखता है और वर्तमान पृष्ठ अलग क्वेरी ऑपरेशन हैं।
MongoDB ब्लॉग पर MongoDB के साथ मुखर खोज के बारे में अधिक जानकारी लिखी गई है जो कुछ अन्य विकल्पों की भी व्याख्या करती है। mongoconnector या अन्य तरीकों का उपयोग करके बाहरी खोज समाधानों के साथ एकीकरण पर लेख भी हैं।