U probeert te sorteren op een metaveld, niet op een normale veldnaam.
Het tweede argument voor $collection->find()
bepaalt welke velden van het document u (wel/niet) wilt retourneren door de zoekopdracht.
Dit is vergelijkbaar met SELECT *...
vs SELECT field1, field2 ...
in SQL-databases.
Nu is er in MongoDB 2.6 een extra trefwoord dat u hier kunt gebruiken, $meta. Met dit sleutelwoord kunt u veldnamen "injecteren" in het retourdocument (die anders niet zouden bestaan). De waarde van deze geïnjecteerde veldnaam zou afkomstig zijn van een soort "metagegevens" van het document of de query die u uitvoert.
De $text-query-operator is een voorbeeld van een operator die meer informatie beschikbaar heeft over het overeenkomende document. Helaas kan hij u op geen enkele manier over deze extra informatie vertellen, aangezien dit uw document op een onverwachte manier zou manipuleren. Het voegt echter wel metadata aan het document toe - en het is aan jou om te beslissen of je het nodig hebt of niet.
De metagegevens die de $text-operator maakt, gebruiken het trefwoord "textScore". Als u die gegevens wilt opnemen, kunt u dit doen door deze toe te wijzen aan een veldnaam naar keuze:
array("myFieldname" => array('$meta' => 'keyword'))
In het geval van $text search (textScore) kunnen we bijvoorbeeld de veldnaam "score" in ons document invoegen door deze array als het 2e argument door te geven aan $collection->find()
:
array("score" => array('$meta' => 'textScore'))
Nu hebben we een veld met de naam "score" in ons retourdocument geïnjecteerd met de waarde "textScore" uit de $text-zoekopdracht.
Maar aangezien dit nog steeds slechts metagegevens van het document zijn, moet u er nog steeds naar verwijzen als $metagegevens als u deze waarde in volgende bewerkingen wilt blijven gebruiken voordat u de query uitvoert.
Dit betekent dat om op het veld te sorteren, je moet sorteren op de $meta-projectie
array('score' => array('$meta' => 'textScore'))
Uw volledige voorbeeld wordt dan:
<?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);
}