PHP MongoDB映射减少db断言失败 [英] PHP MongoDB map reduce db assertion failure

查看:99
本文介绍了PHP MongoDB映射减少db断言失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我第一次使用PHP/MongoDB访问Map/Reduce.我在运行MapReduce命令时遇到错误.

My first go at Map/Reduce using PHP/MongoDB. I am stuck with an error when running the MapReduce command.

我的代码:

$map = "function () {".                                                                                                             
"emit(this.topic_id, {re_date:this.date_posted}); " .                                                                     
"}";

$reduce = "function (key, values) {" . 
"var result = {last_post: 0};" .                                                                                                 
"var max = ISODate('1970-01-01T00:00:00Z');" .                                                                             
"values.forEach(function (value) {" .
       "if (max == ISODate('1970-01-01T00:00:00Z')) {" .
           "max = value.re_date;}" .
      "if (max < value.re_date) {max = value.re_date;}});" .    
"result.last_post = max;" .                                                                                   
"return result;"  .                                                                                              
"}";



$mapFunc = new MongoCode($map);
$reduceFunc = new MongoCode($reduce);

$collection = new MongoCollection($db, 'posts');
$command = array(
'mapreduce' => $collection,
'map' => $mapFunc,
'reduce' => $reduceFunc,
"query" => array("topic_id" => "2116"),
"out" => array("merge" => "eventCounts"));


$threadInfo = $db->command($command);

$threadsCollection = $db->selectCollection($threadInfo['result']);

$stats = $statsCollection->find();

foreach ($stats as $stat) {
    echo $stats['_id'] .' Visited ';
    foreach ($stats['value']['types'] as $type => $times) {
        echo "Type $type $times Times, ";
    }
    foreach ($stats['value']['tags'] as $tag => $times) {
        echo "Tag $tag $times Times, ";
    }
    echo "\n";
}

当我运行命令时,我会得到错误信息:

When I run the command I'm getting back the error:

字段的断言错误类型(mapreduce)3!= 2 assertionCode 13111
errmsg db断言失败
好的0

assertion wrong type for field (mapreduce) 3 != 2 assertionCode 13111
errmsg db assertion failure
ok 0

我非常仔细地跟踪了示例此处,所以我不确定出问题了. 任何建议表示赞赏.

I followed pretty closely the example here so I'm not sure what is going wrong. Any suggestions appreciated.

推荐答案

使用mapReduce()时要记住,reduce()函数的返回值必须与您期望的形状相同.进入reduce()函数的'values'元素中-进而,该形状必须与emit()函数所发出的形状相同.

It is important to remember when using mapReduce() that the return value of the reduce() function needs to be the same shape as the one that you expect to get in the 'values' element of reduce() function -- and that, in turn, needs to be the same shape as what is emitted by the emit() function.

给出一个包含以下格式文档的集合:

Given a collection containing documents of the following form:

> db.posts.count();
1000
> db.posts.findOne();
{
    "_id" : 0,
    "date_posted" : ISODate("2012-04-04T05:54:44.535Z"),
    "topic_id" : "sierra"
}

以下代码将产生您想要的输出:

The following code will produce the output you want:

<?php

$conn = new Mongo("localhost:$port");
$db = $conn->test;
$collection = $db->tst;

$map = new MongoCode(
    "function() { emit( this.topic_id, { last_post: this.date_posted } ); }"
);

$reduce = new MongoCode(
  "function(key, values) { ".
      "var max = ISODate('1970-01-01T00:00:00Z'); ".

      "values.forEach(function(val) { ".
          "if ( max < val.last_post ) max = val.last_post; ".
      "}); ".

      "return {last_post : max}; " .
  "}"
);


$result = $db->command( array(
    "mapreduce" => "posts",
    "map" => $map,
    "reduce" => $reduce,
    "query" => array( "topic_id" => "alpha"), 
    "out" => array( "merge" => "lastPosts")
    )
);
echo "result: "; print_r($result);

$collection = $db->lastPosts;
$cursor = $collection->find()->limit(6);

date_default_timezone_set("UTC");
foreach( $cursor as $doc ) {
    $date = date( "r", $doc['value']['last_post']->sec );
    echo $doc['_id'] . " last visited at " . $date ."\n" ;
}

?>

这篇关于PHP MongoDB映射减少db断言失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆