Quiero obtener todos los documentos que tienen una palabra específica en cualquier json anidado. Un documento en colección se ve así;
Man:{ First name: 'F-Name' Last name: 'L-Name' hobbies:{ sports:'cricket' watching: 'films' } Likeness:{ name: 'F-name' fruit: 'chikoo' } } y hay múltiples documentos de este tipo en la colección. Por ejemplo, quiero encontrar todos los documentos que tienen la palabra F-name . Ver en el json anterior. F-name está en 2 jsons anidados. Pero puede ser en uno solo o en múltiples. ¿Cuál es una forma rápida e inteligente de encontrar todos esos documentos en lugar de dar cualquier campo o nombre Json anidado (Nombre, Semejanza-> nombre en el caso anterior). ¿Hay alguna manera?
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $filter = [ ?? ]; $query = new MongoDB\Driver\Query($filter); $res = $mng->executeQuery("Database.myName", $query);Editar 1 Por sugerencia de @Shail Paras, ejecuto el siguiente código;
<?php $mng = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $query = new \MongoDB\Driver\Query(['createIndex' => ['*' => 'text']]); $res = $mng->executeQuery("BBC_Database.BBC", $query); $filter = ['$text' => ['$search' => "\"F-name\""]]; $query1 = new MongoDB\Driver\Query($filter); $cursor = $mng->executeQuery("Database.Col", $query1); $filteredData = iterator_to_array($cursor); echo "<pre>"; print_r($filteredData); ?>Pero da;
Error fatal: excepción no detectada 'MongoDB\Driver\Exception\RuntimeException' con el mensaje 'índice de texto requerido para la consulta de $texto' en C:\wamp64\www-------filename.php en la línea 7
¿Qué es el índice de texto según el error?
Ok.. Ese es el error de la búsqueda de texto porque la búsqueda de texto solo funciona si se crea la indexación, y creo que su parte de indexación no funciona. es por eso que está lanzando esa excepción. y lo siento por tener prisa. pero Aquí está su solución:
Paso 1: crear índices en todos los documentos usando el comando
$manager = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017"); $command = new MongoDB\Driver\Command([ "createIndexes" => "Col", "indexes" => [[ "name" => "indexName", "key" => ["$**" => "text"], "ns" => "Database.Col", ]], ]); $result = $manager->executeCommand("Database", $command); var_dump($result->toArray()); // this will show u indexing resultPaso 2: Ejecute su consulta
$filter = ['$text' => ['$search' => "\"F-name\""]]; $query1 = new MongoDB\Driver\Query($filter); $cursor = $manager->executeQuery("Database.Col", $query1); $filteredData = iterator_to_array($cursor); echo "<pre>"; print_r($filteredData);Espero que esto pueda ayudarte y, si fue así, no olvides leer estos artículos:
Búsqueda de texto e índices de texto