MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

recherche et tri en texte intégral mongodb php

Vous essayez de trier sur un champ méta, pas un nom de champ normal.

Le deuxième argument de $collection->find() détermine les champs du document que vous souhaitez (voulez/ne voulez pas) voir renvoyés par la requête.

Ceci est similaire à SELECT *... vs SELECT field1, field2 ... dans les bases de données SQL.

Maintenant, dans MongoDB 2.6, il existe un mot-clé supplémentaire que vous pouvez utiliser ici, $meta. Ce mot-clé vous permet "d'injecter" des noms de champs dans le document de retour (qui autrement n'existeraient pas réellement). La valeur de ce nom de champ injecté proviendrait d'une sorte de "métadonnées" du document ou de la requête que vous exécutez.

L'opérateur de requête $text est un exemple d'opérateur qui dispose de plus d'informations sur le document correspondant. Malheureusement, il n'a aucun moyen de vous informer de ces informations supplémentaires car cela manipulerait votre document de manière inattendue. Il attache cependant une métadonnée au document - et c'est à vous de décider si vous en avez besoin ou non.

Les métadonnées créées par l'opérateur $text utilisent le mot-clé "textScore". Si vous souhaitez inclure ces données, vous pouvez le faire en les attribuant au nom de champ de votre choix :

array("myFieldname" => array('$meta' => 'keyword'))

Par exemple, dans le cas de la recherche $text (textScore), nous pouvons injecter le nom de champ "score" dans notre document en passant ce tableau comme 2ème argument à $collection->find() :

array("score" => array('$meta' => 'textScore'))

Nous avons maintenant injecté un champ appelé "score" dans notre document de retour qui a la valeur "textScore" de la recherche $text.

Mais comme il ne s'agit toujours que de métadonnées du document, si vous souhaitez continuer à utiliser cette valeur dans toutes les opérations ultérieures avant d'exécuter la requête, vous devez toujours vous y référer en tant que $meta data.

Cela signifie que pour trier sur le terrain, vous devez trier sur la $meta projection

array('score' => array('$meta' => 'textScore'))

Votre exemple complet devient alors :

<?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);
}