Stai tentando di eseguire l'ordinamento su un meta campo, non su un normale nome di campo.
Il secondo argomento di $collection->find()
determina quali campi del documento si desidera (non si desidera) vengano restituiti dalla query.
È simile a SELECT *...
vs SELECT field1, field2 ...
nei database SQL.
Ora, in MongoDB 2.6 c'è una parola chiave aggiuntiva che puoi usare qui, $meta. Questa parola chiave consente di "iniettare" nomi di campo nel documento di ritorno (che altrimenti non esisterebbe effettivamente). Il valore di questo nome campo inserito proverrebbe da una sorta di "metadati" del documento o della query che stai eseguendo.
L'operatore di query di testo $ è un esempio di un operatore che ha più informazioni disponibili sul documento abbinato. Sfortunatamente, non ha modo di parlarti di queste informazioni extra poiché ciò manipolerebbe il tuo documento in modo imprevisto. Tuttavia, allega un metadati al documento e sta a te decidere se ne hai bisogno o meno.
I metadati creati dall'operatore $text utilizzano la parola chiave "textScore". Se vuoi includere quei dati, puoi farlo assegnandoli a un nome di campo a tua scelta:
array("myFieldname" => array('$meta' => 'keyword'))
Ad esempio, nel caso di $text search (textScore) possiamo inserire il nome del campo "score" nel nostro documento passando questo array come 2° argomento a $collection->find()
:
array("score" => array('$meta' => 'textScore'))
Ora abbiamo inserito un campo chiamato "score" nel nostro documento di ritorno che ha il valore "textScore" dalla ricerca $text.
Ma poiché si tratta ancora solo di metadati del documento, se vuoi continuare a utilizzare questo valore in qualsiasi operazione successiva prima di eseguire la query, devi comunque fare riferimento ad esso come $metadata.
Ciò significa che per ordinare sul campo devi ordinare sulla $meta proiezione
array('score' => array('$meta' => 'textScore'))
Il tuo esempio completo diventa quindi:
<?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);
}