使用PHP和MongoDB的MapReduce

使用PHP和MongoDB的MapReduce,php,mongodb,Php,Mongodb,我对Mongo很陌生,我有一个我认为很简单的问题。如何使用PHP和非传统MongoDB驱动程序或更高级别的MongoDB/MongoDB包实现MapReduce 我看到的每个示例似乎都使用遗留驱动程序()。它们都使用MongoCode对象,这在mongodb.php中不存在。它存在于mongo.php(遗留驱动程序)中。当我尝试使用它时,它会说“找不到类‘MongoCode’” 我的代码看起来像: $function = "function() { emit(this); }"; $map

我对Mongo很陌生,我有一个我认为很简单的问题。如何使用PHP和非传统MongoDB驱动程序或更高级别的MongoDB/MongoDB包实现MapReduce

  • 我看到的每个示例似乎都使用遗留驱动程序()。它们都使用MongoCode对象,这在mongodb.php中不存在。它存在于mongo.php(遗留驱动程序)中。当我尝试使用它时,它会说“找不到类‘MongoCode’”
我的代码看起来像:

$function = "function() { emit(this); }";
$map = new \MongoCode($function);

$command = $db->command([
    "mapreduce" => "db.archiveData",
    "map" => $map,
    "query" => $query,
    "out" => "data"
]);
  • 为了让事情变得更加混乱,当我在上查看源代码时,有一个针对MapReduce()的单元测试。但是它使用了MongoDB\Operation\MapReduce,这在MongoDB/MongoDB的1.1版本中似乎不存在
  • 我想也许我可以使用JavaScript在服务器上调用它。但当我看到它时,它说它“在MongoDB3.0+中被弃用”。所以我觉得这不是我应该用的东西
因此:

  • mongodb/mongodb不支持MapReduce。或者它还没有得到支持,但会得到支持
  • 我必须使用MapReduce的旧版驱动程序
  • 我必须想办法在服务器上通过JavaScript调用db.collection.mapReduce
  • 我必须使用聚合管道()来执行map-reduce类型的操作?但这感觉要有限得多

我遗漏了什么?

所以我现在清楚了事情的真相

  • MapReduce将在PHPLib()的1.2.0中得到正式支持
  • 在此之前,通过按照使用命令对象,有一个完全可用的解决方法
示例如下:

$database = (new MongoDB\Client)->selectDatabase('db_name');
$cursor = $database->command([
    'mapReduce' => 'collection_name',
    'map' => new MongoDB\BSON\Javascript('...'),
    'reduce' => new MongoDB\BSON\Javascript('...'),
    'out' => 'output_collection_name',
]);

$resultDocument = $cursor->toArray()[0];

您也可以通过条令()使用MapReduce,但这是使用遗留和垫片。因此,对于一个新项目来说,这可能不是一个好的选择。

检查一下(如果您还没有):(2017年6月19日),它说明了一些关于
MongoDB\Database::command()
的信息,并且MapReduce尚未实现。谢谢@Parziphal。好发现。这不是我所希望的,但听起来新图书馆不支持它。我还发现我不能使用旧版驱动程序,因为我们正在使用的PHP7.0()似乎不支持旧版驱动程序。是的,我很久以前也遇到过类似的问题,PHP7.0,新的mongo驱动程序不完整。。。我们是怎么修好的?。。。我不记得了,但大约在那个时候,我们开始使用Facebook的解析,所以我们不再直接接触MongoDB,我开始更频繁地使用Node。所以实际上我从来没有找到解决办法。