sql >> Databáze >  >> NoSQL >> MongoDB

php mongodb fulltextové vyhledávání a řazení

Pokoušíte se třídit podle meta pole, nikoli podle normálního názvu pole.

Druhý argument pro $collection->find() určuje, která pole dokumentu chcete (udělat/ne) vrátit dotazem.

Je to podobné jako SELECT *... vs SELECT field1, field2 ... v SQL databázích.

Nyní v MongoDB 2.6 existuje další klíčové slovo, které zde můžete použít, $meta. Toto klíčové slovo vám umožňuje „vložit“ názvy polí do návratového dokumentu (které by jinak ve skutečnosti neexistovaly). Hodnota tohoto vloženého názvu pole by pocházela z nějakého druhu „metadat“ dokumentu nebo dotazu, který spouštíte.

Operátor dotazu $text je příkladem operátoru, který má k dispozici více informací o shodném dokumentu. Bohužel vám o těchto dalších informacích nemůže sdělit, protože by to neočekávaně manipulovalo s vaším dokumentem. K dokumentu však připojí metadata – a je na vás, abyste se rozhodli, zda je potřebujete nebo ne.

Metadata, která operátor $text vytvoří, používají klíčové slovo „textScore“. Chcete-li tato data zahrnout, můžete tak učinit přiřazením k názvu pole podle vašeho výběru:

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

Například v případě $text search (textScore) můžeme vložit název pole "skóre" do našeho dokumentu předáním tohoto pole jako 2. argument do $collection->find() :

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

Nyní jsme do našeho návratového dokumentu vložili pole s názvem "score", které má hodnotu "textScore" z $text search.

Ale protože se stále jedná pouze o metadata dokumentu, chcete-li tuto hodnotu nadále používat v jakýchkoli následujících operacích před provedením dotazu, musíte ji stále označovat jako $meta data.

To znamená, že pro řazení na poli musíte třídit na $meta projekci

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

Váš úplný příklad pak bude:

<?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. pymongo:název 'ISODate' není definován

  2. Co bych měl používat? Pokoje Socket.io nebo Redis pub-sub?

  3. Meteor:Neočekávaný výstupní kód mongo 100. Restartování. Server mongo nelze spustit

  4. Stručná referenční příručka k různým databázím NoSQL