Pokoušíte se třídit podle meta pole, nikoli podle normálního názvu pole.
Druhý argument pro $collection->find()
určuje, která pole dokumentu chcete (udělat/ne) vrátit dotazem.
Je to podobné jako SELECT *...
vs SELECT field1, field2 ...
v SQL databázích.
Nyní v MongoDB 2.6 existuje další klíčové slovo, které zde můžete použít, $meta. Toto klíčové slovo vám umožňuje „vložit“ názvy polí do návratového dokumentu (které by jinak ve skutečnosti neexistovaly). Hodnota tohoto vloženého názvu pole by pocházela z nějakého druhu „metadat“ dokumentu nebo dotazu, který spouštíte.
Operátor dotazu $text je příkladem operátoru, který má k dispozici více informací o shodném dokumentu. Bohužel vám o těchto dalších informacích nemůže sdělit, protože by to neočekávaně manipulovalo s vaším dokumentem. K dokumentu však připojí metadata – a je na vás, abyste se rozhodli, zda je potřebujete nebo ne.
Metadata, která operátor $text vytvoří, používají klíčové slovo „textScore“. Chcete-li tato data zahrnout, můžete tak učinit přiřazením k názvu pole podle vašeho výběru:
array("myFieldname" => array('$meta' => 'keyword'))
Například v případě $text search (textScore) můžeme vložit název pole "skóre" do našeho dokumentu předáním tohoto pole jako 2. argument do $collection->find()
:
array("score" => array('$meta' => 'textScore'))
Nyní jsme do našeho návratového dokumentu vložili pole s názvem "score", které má hodnotu "textScore" z $text search.
Ale protože se stále jedná pouze o metadata dokumentu, chcete-li tuto hodnotu nadále používat v jakýchkoli následujících operacích před provedením dotazu, musíte ji stále označovat jako $meta data.
To znamená, že pro řazení na poli musíte třídit na $meta projekci
array('score' => array('$meta' => 'textScore'))
Váš úplný příklad pak bude:
<?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);
}