sql >> Databasteknik >  >> NoSQL >> MongoDB

php mongodb fulltextsökning och sortering

Du försöker sortera på ett metafält, inte ett normalt fältnamn.

Det andra argumentet till $collection->find() bestämmer vilka fält i dokumentet du (gör/inte) vill ska returneras av frågan.

Detta liknar SELECT *... vs SELECT field1, field2 ... i SQL-databaser.

Nu, i MongoDB 2.6 finns det ytterligare ett nyckelord som du kan använda här, $meta. Detta nyckelord låter dig "injicera" fältnamn i returdokumentet (som annars inte skulle existera). Värdet på detta injicerade fältnamn skulle komma från någon sorts "metadata" för dokumentet eller frågan du kör.

Frågeoperatorn $text är ett exempel på en operator som har mer information tillgänglig om det matchade dokumentet. Tyvärr har den inget sätt att berätta om denna extra information eftersom det skulle manipulera ditt dokument på ett oväntat sätt. Det bifogar dock en metadata till dokumentet - och det är upp till dig att bestämma om du har behov av det eller inte.

Metadata som $text-operatorn skapar använder nyckelordet "textScore". Om du vill inkludera den informationen kan du göra det genom att tilldela den till ett valfritt fältnamn:

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

Till exempel, i fallet med $textsökning (textScore) kan vi injicera fältnamnet "poäng" i vårt dokument genom att skicka denna array som det andra argumentet till $collection->find() :

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

Nu har vi injicerat ett fält som heter "score" i vårt returdokument som har "textScore"-värdet från $text-sökningen.

Men eftersom detta fortfarande bara är metadata för dokumentet, om du vill fortsätta att använda detta värde i några efterföljande operationer innan du kör frågan, måste du fortfarande hänvisa till det som $metadata.

Det betyder att för att sortera på fältet måste du sortera på $metaprojektionen

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

Ditt fullständiga exempel blir då:

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



  1. Det går inte att ansluta till Redis från Docker

  2. Använd mongoexport med en --query för ISODate

  3. MongoDB $type Aggregation Pipeline Operator

  4. Hadoop Map/Reduce vs inbyggd Map/Reduce