Próbujesz posortować według metapola, a nie normalnej nazwy pola.
Drugi argument $collection->find()
określa, które pola dokumentu chcesz (nie chcesz) zwrócić przez zapytanie.
Jest to podobne do SELECT *...
vs SELECT field1, field2 ...
w bazach danych SQL.
Teraz w MongoDB 2.6 istnieje dodatkowe słowo kluczowe, którego możesz użyć tutaj, $meta. To słowo kluczowe umożliwia „wstrzyknięcie” nazw pól do dokumentu zwrotnego (które w przeciwnym razie w rzeczywistości by nie istniały). Wartość tej wstrzykniętej nazwy pola pochodziłaby z pewnego rodzaju „metadanych” dokumentu lub zapytania, które wykonujesz.
Operator zapytania $text jest przykładem operatora, który ma więcej dostępnych informacji o dopasowanym dokumencie. Niestety, nie ma możliwości poinformowania o tych dodatkowych informacjach, ponieważ spowodowałoby to nieoczekiwaną manipulację dokumentem. Dołącza jednak do dokumentu metadane – i od Ciebie zależy, czy potrzebujesz tego, czy nie.
Metadane tworzone przez operatora $text używają słowa kluczowego „textScore”. Jeśli chcesz uwzględnić te dane, możesz to zrobić, przypisując je do wybranej nazwy pola:
array("myFieldname" => array('$meta' => 'keyword'))
Na przykład w przypadku wyszukiwania $text (textScore) możemy wstrzyknąć nazwę pola "score" do naszego dokumentu, przekazując tę tablicę jako drugi argument do $collection->find()
:
array("score" => array('$meta' => 'textScore'))
Teraz wprowadziliśmy pole o nazwie "score" do naszego dokumentu zwrotnego, który ma wartość "textScore" z wyszukiwania $text.
Ale ponieważ są to nadal tylko metadane dokumentu, jeśli chcesz nadal używać tej wartości w kolejnych operacjach przed wykonaniem zapytania, nadal musisz odwoływać się do nich jako $metadata.
Oznacza to, że aby posortować według pola, musisz posortować według rzutu $meta
array('score' => array('$meta' => 'textScore'))
Twój pełny przykład stanie się wtedy:
<?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);
}