-
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.
- links to