PHP Mongo:在整个集合中搜索特定文本

时间:2017-05-02 11:16:14

标签: php mongodb mongodb-query

我希望在任何嵌套的json中获取具有特定单词的所有文档。集合中的文档看起来像这样;

Man:{
        First name: 'F-Name'
        Last name: 'L-Name'
        hobbies:{
            sports:'cricket'
            watching: 'films'
        }
        Likeness:{
            name: 'F-name'
            fruit: 'chikoo'
        }
    }

收集中有多个这样的文件。 例如,我想找到所有包含单词F-name的文档。见上面的json。 F-name位于2个嵌套的jsons中。但它可以只有一个或多个。什么是快速和智能的方式来查找所有文档而不是给出任何字段或嵌套的Json名称(在上面的例子中,名字,相似度 - >名称)。有什么办法吗?

$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$filter = [ ?? ];
$query = new MongoDB\Driver\Query($filter);     
$res = $mng->executeQuery("Database.myName", $query);

修改1 根据@Shail Paras的建议,我运行以下代码;

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

但它给出了;

  

致命错误:未捕获的异常&#39; MongoDB \ Driver \ Exception \ RuntimeException&#39;带有消息&$ 39; $ text query&#39;文本索引在第7行的C:\ wamp64 \ www ------- filename.php

根据错误是什么文本索引?

1 个答案:

答案 0 :(得分:2)

确定..这是Text Search的错误,因为文本搜索仅在创建索引时有效,并且我认为您的索引部分无效。这就是它抛出异常的原因。我很抱歉匆忙但这是你的解决方案:

步骤1:使用Command

在所有文档中创建索引
$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 result

第2步:运行查询

$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);

希望这可以帮助你,如果确实如此,那么别忘了阅读这些文章:

Text Search&amp; Text Indexes