आप मेटा फ़ील्ड पर सॉर्ट करने का प्रयास कर रहे हैं, सामान्य फ़ील्डनाम नहीं।
दूसरा तर्क $collection->find()
यह निर्धारित करता है कि आप दस्तावेज़ के किन क्षेत्रों को क्वेरी द्वारा वापस करना चाहते हैं (क्या/नहीं) करना चाहते हैं।
यह SELECT *...
. के समान है बनाम SELECT field1, field2 ...
SQL डेटाबेस में।
अब, MongoDB 2.6 में एक अतिरिक्त कीवर्ड है जिसका आप यहां उपयोग कर सकते हैं, $meta. यह कीवर्ड आपको रिटर्न दस्तावेज़ में फ़ील्डनाम को "इंजेक्ट" करने की अनुमति देता है (जो अन्यथा वास्तव में मौजूद नहीं होगा)। इस इंजेक्शन वाले फ़ील्डनाम का मान आपके द्वारा निष्पादित किए जा रहे दस्तावेज़ या क्वेरी के "मेटा डेटा" के किसी प्रकार से आएगा।
$text क्वेरी ऑपरेटर एक ऐसे ऑपरेटर का उदाहरण है जिसके पास मिलान किए गए दस्तावेज़ के बारे में अधिक जानकारी उपलब्ध है। दुर्भाग्य से, इसके पास आपको इस अतिरिक्त जानकारी के बारे में बताने का कोई तरीका नहीं है क्योंकि ऐसा करने से आपके दस्तावेज़ में अप्रत्याशित तरीके से हेरफेर होगा। हालांकि यह दस्तावेज़ के साथ एक मेटाडेटा संलग्न करता है - और यह आपको तय करना है कि आपको इसकी आवश्यकता है या नहीं।
$text ऑपरेटर द्वारा बनाया गया मेटा डेटा "textScore" कीवर्ड का उपयोग करता है। यदि आप उस डेटा को शामिल करना चाहते हैं, तो आप इसे अपनी पसंद के फ़ील्ड नाम पर निर्दिष्ट करके ऐसा कर सकते हैं:
array("myFieldname" => array('$meta' => 'keyword'))
उदाहरण के लिए, $text search (textScore) के मामले में हम इस सरणी को $collection->find()
के दूसरे तर्क के रूप में पास करके अपने दस्तावेज़ में फ़ील्डनाम "स्कोर" को इंजेक्ट कर सकते हैं। :
array("score" => array('$meta' => 'textScore'))
अब हमने अपने रिटर्न दस्तावेज़ में "स्कोर" नामक एक फ़ील्ड इंजेक्ट किया है जिसमें $text खोज से "textScore" मान है।
लेकिन चूंकि यह अभी भी दस्तावेज़ का मेटा डेटा है, यदि आप क्वेरी को निष्पादित करने से पहले किसी भी बाद के संचालन में इस मान का उपयोग करना जारी रखना चाहते हैं, तो भी आपको इसे $meta डेटा के रूप में संदर्भित करना होगा।
इसका मतलब है, फ़ील्ड को सॉर्ट करने के लिए आपको $meta प्रोजेक्शन पर सॉर्ट करना होगा
array('score' => array('$meta' => 'textScore'))
आपका पूरा उदाहरण तब बन जाता है:
<?php
$mc = new MongoClient();
$collection = $mc->selectCollection("myDatabase", "myCollection");
$string = "search string";
$cursor = $collection->find(
array('$text' => array('$search' => $string)),
array('score' => array('$meta' => 'textScore'))
);
$cursor = $cursor->sort(
array('score' => array('$meta' => 'textScore'))
);
foreach($cursor as $document) {
var_dump($document);
}