您正在尝试按元字段而非普通字段名进行排序。
$collection->find()
的第二个参数决定了查询时返回的文档中哪些字段需要或不需要被返回。
这类似于 SQL 数据库中的 SELECT *...
vs SELECT field1, field2 ...
。
现在,在 MongoDB 2.6 中有一个额外的关键字 $meta 可以在此处使用。使用该关键字可以“注入”字段名到返回的文档中(否则实际上不存在该字段)。该注入字段名的值将来自正在执行的文档或查询的某种“元数据”。
$text查询操作符是一个例子,它拥有有关匹配文档的更多信息。不幸的是,它无法告诉您有关此额外信息的内容,因为这样做会以意想不到的方式操作您的文档。但是,它会将元数据附加到文档上,您可以自行决定是否需要它。
$text操作符创建的元数据使用关键字"textScore"。如果您想包含该数据,可以通过将其分配给您选择的字段名称来实现:
array("myFieldname" => array('$meta' => 'keyword'))
例如,在$text搜索(textScore)的情况下,我们可以通过将此数组作为第二个参数传递给
$collection->find()
来将字段名“score”注入到我们的文档中:
array("score" => array('$meta' => 'textScore'))
现在我们已经将一个名为“score”的字段注入到我们的返回文档中,该字段具有来自$text搜索的“textScore”值。
但是由于这仍然只是文档的元数据,如果您想在执行查询之前继续使用此值进行任何后续操作,则仍必须将其称为$meta数据。
这意味着,要对该字段进行排序,您必须对
$meta projection进行排序。
array('score' => array('$meta' => 'textScore'))
您的完整示例如下:
<?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);
}