Ignoring "query" param in MongoDB\Driver\Command

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Done
    • Priority: Major - P3
    • None
    • Affects Version/s: 1.1.1, 1.1.2
    • Component/s: None
    • None
    • Environment:
      Windows, ubuntu
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      If I using mapreduce mongodb from MongoDB\Driver\Command, then nothing expressions in query parameter in mapreduce command doesn't working with this driver.
      My helper class:

      <?php
      
      class MongoProvider {
      
          private $_connectionManager = null;
      
          public function __construct() {
              $connectionUri = $this->getUri();
              $this->_connectionManager = new MongoDB\Driver\Manager($connectionUri);
          }
      
          private function getUri() {
              $uri = 'mongodb://';
              $connectionConfig = Config::get('database.connections.mongodb');
              if (empty($connectionConfig)) {
                  throw new \Exception('Empty MongoDB config');
              }
      
              if (!empty($connectionConfig['username'])) {
                  $uri .= $connectionConfig['username'];
                  if (!empty($connectionConfig['password'])) {
                      $uri .= ':' . $connectionConfig['password'];
                  }
                  $uri .= '@';
              }
              if (!empty($connectionConfig['host'])) {
                  foreach ($connectionConfig['host'] as $host) {
                      $uri .= $host . ':' . $connectionConfig['port'] . ',';
                  }
                  $uri = rtrim($uri, ',');
              }
              $uri .= '/';
              if (!empty($connectionConfig['database'])) {
                  $uri .= $connectionConfig['database'];
              }
              if (!empty($connectionConfig['options'])) {
                  $uri .= '?';
                  foreach ($connectionConfig['options'] as $optionName => $optionValue) {
                      $uri .= $optionName . '=' . $optionValue . ',';
                  }
                  $uri = rtrim($uri, ',');
              }
              return $uri;
          }
      
          public function mapReduce($collection, $map, $reduce, $finalize, $query = [], $sort = []) {        
      
              $q = new MongoDB\Driver\Command([
                  'mapreduce' => $collection,
                  'map' => $map,
                  'reduce' => $reduce,
                  'finalize' => $finalize,
                  'query' => new MongoDB\Driver\Query($query),
                  'sort' => $sort,
                  'out' => ['inline' => 1]
              ]);
              $response = $this->_connectionManager->executeCommand('adsystem', $q);
              if (!empty($response)) {
                  $result = (array)$response->toArray()[0];
              } else {
                  return false;
              }
              if ($result['ok'] == 0) {
                  echo $result['errmsg'];
                  return false;
              } else {
                  return $result['results'];
              }
          }
      
      }
      

      Checking function:

              $query = [];
              // 20 Dec 2015
              $query['val']['$gt'] = 50; 
              /*
               * Nothing working
               * $query['val'] = 18;
               * $query[''] = new \MongoDB\BSON\UTCDatetime(1450569600000);         
               */
              $mgo = new \MongoProvider();
              $map = 'function () { emit(this.date, 1); }';
              $reduce = 'function reduce(key, values) { return values[0]; }';
              $finalize = 'function finalize(key, reduced) { return reduced; }';
              $sort = ['hour' => 1];
              $data = $mgo->mapReduce('testmap', $map, $reduce, $finalize, $query, $sort);
              foreach ($data as $resultEntry) {
                  echo $resultEntry->_id->toDateTime()->format('d M Y') . "<br>";
              } 
      

      Data:

      {
        "_id" : 1,
        "date" : ISODate("2015-12-20T00:00:00Z"),
        "val" : 32
      },
      {
        "_id" : 2,
        "date" : ISODate("2015-12-20T00:00:00Z"),
        "val" : 21
      },
      {
        "_id" : 3,
        "date" : ISODate("2015-12-21T00:00:00Z"),
        "val" : 53
      },
      {
        "_id" : 4,
        "date" : ISODate("2015-12-21T00:00:00Z"),
        "val" : 58
      },
      {
        "_id" : 5,
        "date" : ISODate("2015-12-22T00:00:00Z"),
        "val" : 86
      },
      {
        "_id" : 6,
        "date" : ISODate("2015-12-22T00:00:00Z"),
        "val" : 18
      }
      

      But, if I try to use external tool, query already working, see attached screen.

            Assignee:
            Jeremy Mikola
            Reporter:
            Dmitriy Mandrika
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: