【问题标题】:PHP Mongo: Search for a particular text in whole collectionPHP Mongo:在整个集合中搜索特定文本
【发布时间】:2017-09-29 21:31:00
【问题描述】:

我想在任何嵌套的 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 个嵌套的 json 中。但它可以只有一个或多个。什么是查找所有文档而不是提供任何字段或嵌套 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);
?>

但它给了;

致命错误:在 C:\wamp64\www-------filename.php 第 7 行中未捕获异常 'MongoDB\Driver\Exception\RuntimeException' 并带有消息 'text index required for $text query'

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

【问题讨论】:

    标签: php mongodb mongodb-query


    【解决方案1】:

    好的.. 那是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 & Text Indexes

    【讨论】:

    • 请按照问题中给出的MongoManager 课程进行操作。
    • 兄弟,请自己动手吧..我刚刚给了你一个想法..怎么做!!您只需要将$filter 变量更改为$search..
    • 正如问题中所讨论的那样,F-name 可以在任何位置,在任何 json 或任何数组中。 什么是查找所有文档而不是提供任何字段或嵌套 Json 名称的快速智能方法 您正在提供 json 名称 Likeness.name。我想要通用搜索。
    • 每次我必须做索引还是只做一次?
    • 你定义mng了吗?在线$cursor = $mng-&gt;executeQuery("Database.Col", $query1);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2013-07-13
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多