

PHP / mongod 初心者です。  
mongodbのPHPによる検索に行き詰まっています。

**状況**  
mongodbに以下の6ドキュメントが存在しています。

[code]

    db.mongo_test01.find({},{_id: 0}).sort({"Data.Value": 1})
    { "Data" : [ { "Name" : "Japan", "Value" : 100 }, { "Name" : "US", "Value" : 200 } ] }
    { "Data" : [ { "Name" : "Japan", "Value" : 101 }, { "Name" : "US", "Value" : 201 } ] }
    { "Data" : [ { "Name" : "Japan", "Value" : 102 }, { "Name" : "US", "Value" : 202 } ] }
    { "Data" : [ { "Name" : "Japan", "Value" : 103 }, { "Name" : "US", "Value" : 203 } ] }
    { "Data" : [ { "Name" : "Japan", "Value" : 104 }, { "Name" : "US", "Value" : 204 } ] }
    { "Data" : [ { "Name" : "Japan", "Value" : 105 }, { "Name" : "US", "Value" : 205 } ] }
    
[/code]

このcollectionに対してmongoclientにて以下の検索を実施します。

[code]

    db.mongo_test01.find({$and:[{"Data":{$elemMatch:{"Name":"Japan","Value":{$gte:103}}}},{"Data":{$elemMatch:{"Name":"US","Value":{$lte:203}}}}]},{_id: 0})
    { "Data" : [ { "Name" : "Japan", "Value" : 103 }, { "Name" : "US", "Value" : 203 } ] }
    
[/code]

結果は１ドキュメントで期待どおりです。

そこでこのクエリを以下のphpで表現してみました。

[code]

    <?php
    $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    
    $filter = ['$and' => [["Data" => ['$elemMatch' => ["Name" => "Japan","Value" => ['$gte'=>103]]]],["Data" => ['$elemMatch' => ["Name" => "US","Value" => ['$gte'=>203]]]]]];
    
    $options = [
      'projection' => ['_id' => 0]
    ];
    $query = new MongoDB\Driver\Query($filter, $options);
    $cursor = $manager->executeQuery('test.mongo_test01', $query);
    
    foreach ($cursor as $document) {
      var_dump($document);
      foreach ($document->Data as $data) {
        print ($data->Name ."<br/>");
      }
    }
    ?>
    
[/code]

結果は

[code]

    object(stdClass)#7 (1) { ["Data"]=> array(2) { [0]=> object(stdClass)#5 (2) { ["Name"]=> string(5) "Japan" ["Value"]=> float(105) } [1]=> object(stdClass)#6 (2) { ["Name"]=> string(2) "US" ["Value"]=> float(205) } } } Japan
    US
    object(stdClass)#10 (1) { ["Data"]=> array(2) { [0]=> object(stdClass)#8 (2) { ["Name"]=> string(5) "Japan" ["Value"]=> float(104) } [1]=> object(stdClass)#9 (2) { ["Name"]=> string(2) "US" ["Value"]=> float(204) } } } Japan
    US
    object(stdClass)#5 (1) { ["Data"]=> array(2) { [0]=> object(stdClass)#6 (2) { ["Name"]=> string(5) "Japan" ["Value"]=> float(103) } [1]=> object(stdClass)#7 (2) { ["Name"]=> string(2) "US" ["Value"]=> float(203) } } } Japan
    US
    
[/code]

と３ドキュメントが出力されて、mongoclientの結果と一致しません。  
PHPの$filterの書き方に問題があると思いますが、よくわかりません。

どなたかご教授をお願いします。

**環境**  
mongodb 4.0.4  
PHP 5.6.39 (cli) (built: Aug 8 2019 16:46:33)  
Red Hat Enterprise Linux Server release 7.6 (Maipo)


CC BY-SA 4.0
2020-01-22T00:40:13.310
62445
2020-01-22T01:13:36.733
2020-01-22T01:13:36.733
3060
37541
question
php mongodb
mongodb サブドキュメントの配列データの$andクエリがphpで表現できない