Опитвате се да сортирате по мета поле, а не по нормално име на поле.
Вторият аргумент за $collection->find()
определя кои полета на документа искате (не/не) искате да бъдат върнати от заявката.
Това е подобно на SELECT *...
срещу SELECT field1, field2 ...
в SQL бази данни.
Сега в MongoDB 2.6 има допълнителна ключова дума, която можете да използвате тук, $meta. Тази ключова дума ви позволява да „инжектирате“ имена на полета в документа за връщане (който иначе всъщност не би съществувал). Стойността на това инжектирано име на поле ще дойде от някакъв вид „мета данни“ на документа или заявката, която изпълнявате.
Операторът за заявка $text е пример за оператор, който разполага с повече информация за съответстващия документ. За съжаление, той няма начин да ви каже за тази допълнителна информация, тъй като това би манипулирало вашия документ по неочакван начин. Той обаче прикачва метаданни към документа - и от вас зависи да решите дали имате нужда от него или не.
Метаданните, които операторът $text създава, използват ключовата дума "textScore". Ако искате да включите тези данни, можете да го направите, като ги присвоите на име на поле по ваш избор:
array("myFieldname" => array('$meta' => 'keyword'))
Например, в случай на $text search (textScore) можем да инжектираме името на полето "score" в нашия документ, като предадем този масив като 2-ри аргумент на $collection->find()
:
array("score" => array('$meta' => 'textScore'))
Сега инжектирахме поле, наречено "резултат" в нашия документ за връщане, който има стойността "textScore" от $text търсенето.
Но тъй като това все още са само метаданни на документа, ако искате да продължите да използвате тази стойност във всички следващи операции, преди да изпълните заявката, все пак трябва да се отнасяте към тях като $meta data.
Това означава, че за да сортирате по полето, трябва да сортирате по $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);
}