Você está tentando classificar em um metacampo, não em um nome de campo normal.
O segundo argumento para
$collection->find()
determina quais campos do documento você (não) deseja que sejam retornados pela consulta. Isso é semelhante a
SELECT *...
vs SELECT field1, field2 ...
em bancos de dados SQL. Agora, no MongoDB 2.6, há uma palavra-chave adicional que você pode usar aqui, $meta. Esta palavra-chave permite que você "injete" nomes de campo no documento de retorno (que de outra forma não existiria). O valor desse nome de campo injetado viria de algum tipo de "metadados" do documento ou consulta que você está executando.
O operador $text query é um exemplo de operador que tem mais informações disponíveis sobre o documento correspondente. No entanto, ele anexa um metadados ao documento - e cabe a você decidir se precisa dele ou não.
Os metadados que o operador $text cria usam a palavra-chave "textScore". Se você quiser incluir esses dados, poderá fazê-lo atribuindo-os a um nome de campo de sua escolha:
array("myFieldname" => array('$meta' => 'keyword'))
Por exemplo, no caso de $text search (textScore) podemos injetar o fieldname "score" em nosso documento passando este array como o segundo argumento para
$collection->find()
:array("score" => array('$meta' => 'textScore'))
Agora injetamos um campo chamado "score" em nosso documento de retorno que tem o valor "textScore" da pesquisa $text.
Mas como isso ainda é apenas metadados do documento, se você quiser continuar a usar esse valor em qualquer operação subsequente antes de executar a consulta, ainda precisará se referir a ele como $ meta dados.
Isso significa que, para classificar no campo, você deve classificar na projeção $ meta
array('score' => array('$meta' => 'textScore'))
Seu exemplo completo então se torna:
<?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);
}