我正在从旧的PHP MongoDB驱动程序升级我的代码: http://php.net/manual/en/class.mongoclient.php
到新的MongoDB驱动程序: http://php.net/manual/en/set.mongodb.php
在以前的版本中我有这个:
$db->collection->find([
'$text' => [ '$search' => "stackoverflow" ]
],
[
'score' => [ '$meta' => 'textScore' ]
])->sort([ 'sort' => [ 'score' => [ '$meta' => 'textScore' ] ] ]);
在新版本中,光标上没有任何排序功能,您必须将其作为选项传递。所以新代码是这样的:
$db->collection->find([
'$text' => [ '$search' => 'stackoverflow' ]
],
[
'score' => [ '$meta' => 'textScore' ],
'sort' => [ 'score' => [ '$meta' => 'textScore' ] ]
]);
但我收到一个错误: “BadValue必须为所有$ meta排序键提供$ meta投影”
这是因为,分数预测不再发生了。如果您只是删除排序选项和日志结果,您将看到结果数组中没有得分。根本没有关于它的文档。
有谁知道如何解决这个问题?
谢谢
答案 0 :(得分:4)
如果要搜索Mongo文本索引并使用新的PHP驱动程序对textScore字段进行排序,则必须使用Query类,在那里添加过滤器和选项,然后使用Manager类执行。在你的情况下,它将是这样的:
$filter = [
'$text' => ['$search' => 'stackoverflow']];
$options = [
'projection' => [
'score' => ['$meta' => 'textScore']
],
'sort' => [
'score' => ['$meta' => 'textScore']
]
];
$mng = new MongoDB\Driver\Manager("mongodb://yourdbserver:27017");
$mongoQuery = new MongoDB\Driver\Query($filter, $options);
$cursor = $mng->executeQuery('db_name.collection_name', $mongoQuery);
请参阅Query class的文档页面,第一个注释似乎非常有用。
答案 1 :(得分:0)
也可以通过这种方式完成:
$collection = (new MongoDB\Client)->DB->COLLECTION;
$cursor = $collection->find(
['$text' => ['$search' => 'stackoverflow']],
[
'projection' => [
'score' => ['$meta' => 'textScore']
],
'sort' => [
'score' => ['$meta' => 'textScore']
]
]
);
并带有跳过和限制:
$collection = (new MongoDB\Client)->DB->COLLECTION;
$cursor = $collection->find(
['$text' => ['$search' => 'stackoverflow']],
['skip' => 0,
'limit' => 20,
'projection' => [
'score' => ['$meta' => 'textScore']
],
'sort' => [
'score' => ['$meta' => 'textScore']
]
]
);