sql >> Database >  >> NoSQL >> MongoDB

php mongodb zoeken en sorteren in volledige tekst

U probeert te sorteren op een metaveld, niet op een normale veldnaam.

Het tweede argument voor $collection->find() bepaalt welke velden van het document u (wel/niet) wilt retourneren door de zoekopdracht.

Dit is vergelijkbaar met SELECT *... vs SELECT field1, field2 ... in SQL-databases.

Nu is er in MongoDB 2.6 een extra trefwoord dat u hier kunt gebruiken, $meta. Met dit sleutelwoord kunt u veldnamen "injecteren" in het retourdocument (die anders niet zouden bestaan). De waarde van deze geïnjecteerde veldnaam zou afkomstig zijn van een soort "metagegevens" van het document of de query die u uitvoert.

De $text-query-operator is een voorbeeld van een operator die meer informatie beschikbaar heeft over het overeenkomende document. Helaas kan hij u op geen enkele manier over deze extra informatie vertellen, aangezien dit uw document op een onverwachte manier zou manipuleren. Het voegt echter wel metadata aan het document toe - en het is aan jou om te beslissen of je het nodig hebt of niet.

De metagegevens die de $text-operator maakt, gebruiken het trefwoord "textScore". Als u die gegevens wilt opnemen, kunt u dit doen door deze toe te wijzen aan een veldnaam naar keuze:

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

In het geval van $text search (textScore) kunnen we bijvoorbeeld de veldnaam "score" in ons document invoegen door deze array als het 2e argument door te geven aan $collection->find() :

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

Nu hebben we een veld met de naam "score" in ons retourdocument geïnjecteerd met de waarde "textScore" uit de $text-zoekopdracht.

Maar aangezien dit nog steeds slechts metagegevens van het document zijn, moet u er nog steeds naar verwijzen als $metagegevens als u deze waarde in volgende bewerkingen wilt blijven gebruiken voordat u de query uitvoert.

Dit betekent dat om op het veld te sorteren, je moet sorteren op de $meta-projectie

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

Uw volledige voorbeeld wordt dan:

<?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. Mongodb:kon geen verbinding maken met de server bij de eerste verbinding

  2. Hoe addToSet uit te voeren met de officiële Go-driver?

  3. Fout:Kan geen verbinding maken met Redis op redis:6379:Naam of service niet bekend

  4. Overslaan/Mock Redis In Junit