MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

php mongodb wyszukiwanie pełnotekstowe i sortowanie

Próbujesz posortować według metapola, a nie normalnej nazwy pola.

Drugi argument $collection->find() określa, które pola dokumentu chcesz (nie chcesz) zwrócić przez zapytanie.

Jest to podobne do SELECT *... vs SELECT field1, field2 ... w bazach danych SQL.

Teraz w MongoDB 2.6 istnieje dodatkowe słowo kluczowe, którego możesz użyć tutaj, $meta. To słowo kluczowe umożliwia „wstrzyknięcie” nazw pól do dokumentu zwrotnego (które w przeciwnym razie w rzeczywistości by nie istniały). Wartość tej wstrzykniętej nazwy pola pochodziłaby z pewnego rodzaju „metadanych” dokumentu lub zapytania, które wykonujesz.

Operator zapytania $text jest przykładem operatora, który ma więcej dostępnych informacji o dopasowanym dokumencie. Niestety, nie ma możliwości poinformowania o tych dodatkowych informacjach, ponieważ spowodowałoby to nieoczekiwaną manipulację dokumentem. Dołącza jednak do dokumentu metadane – i od Ciebie zależy, czy potrzebujesz tego, czy nie.

Metadane tworzone przez operatora $text używają słowa kluczowego „textScore”. Jeśli chcesz uwzględnić te dane, możesz to zrobić, przypisując je do wybranej nazwy pola:

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

Na przykład w przypadku wyszukiwania $text (textScore) możemy wstrzyknąć nazwę pola "score" do naszego dokumentu, przekazując tę ​​tablicę jako drugi argument do $collection->find() :

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

Teraz wprowadziliśmy pole o nazwie "score" do naszego dokumentu zwrotnego, który ma wartość "textScore" z wyszukiwania $text.

Ale ponieważ są to nadal tylko metadane dokumentu, jeśli chcesz nadal używać tej wartości w kolejnych operacjach przed wykonaniem zapytania, nadal musisz odwoływać się do nich jako $metadata.

Oznacza to, że aby posortować według pola, musisz posortować według rzutu $meta

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

Twój pełny przykład stanie się wtedy:

<?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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sortowanie według wielu pól Mongo DB

  2. Zbiorcze upsert w MongoDB przy użyciu mongoose

  3. Jak mogę użyć zmiennej regex w zapytaniu do MongoDB?

  4. Mongodb się nie uruchamia

  5. Prosty sposób na generowanie kodu za pomocą Mongoose i Node.js i Underscore?