gpt4 book ai didi

php - MongoDB MapReduce 在 PHP 中不返回任何数据

转载 作者:可可西里 更新时间:2023-10-31 22:52:14 25 4
gpt4 key购买 nike

我正在使用 Mongo MapReduce 对一堆文档执行字数统计操作。这些文档非常简单(只有一个 ID 和一个单词哈希):

{ "_id" : 6714078, "words" : { "my" : 1, "cat" : 1, "john" : 1, "likes" : 1, "cakes" : 1 } }
{ "_id" : 6715298, "words" : { "jeremy" : 1, "kicked" : 1, "the" : 1, "ball" : 1 } }
{ "_id" : 6717695, "words" : { "dogs" : 1, "can't" : 1, "look" : 1, "up" : 1 } }

数据库在我的环境中被称为“words”,所讨论的集合被命名为“wordsX”,其中 X 是类别编号(我知道,不要问)。存储单词的文档哈希中的字段也被命名为“单词”。嘎。

我遇到的问题是,在我的 PHP 应用程序的某些条件下,MapReduce 不返回任何数据。恼人的是,从 Mongo shell 运行相同的命令会得到完美的结果。我试图确定此错误发生的位置,但我真的很困惑,所以希望有人能够对此有所了解。这个问题的前导确实有点拖沓,因为环境有点复杂,还请大家多多包涵。

我尝试从 Mongo shell 运行以复制基于 PHP 的操作的命令如下:

m = function () {
if (this.words) {
for (index in this.words) {
emit(index, this.words[index]);
}
}
}
r = function (key, values) {
var total = 0;
for (var i in values) {
total += values[i];
}
return total;
}
res = db.words.mapReduce(m, r, { query : { _id : { $in : [6714078,6715298,6717695] } } });

这会导致创建一个包含字数统计数据的临时集合。到目前为止一切正常。

但是,如果我从 PHP(使用标准的 Mongo 库)运行相同的命令,在某些情况下我最终没有数据。描述起来有点棘手,因为我不想让您厌烦除 Mongo 之外的应用程序/环境的细节,但基本上我使用 Sphinx 来过滤一些记录,然后向 Mongo 提供内容 ID 列表,其中执行 MapReduce。如果我在 2 或 3 天后过滤回数据集,我会从 Mongo 得到结果;如果我不过滤,我会得到一个空的数据集。运行相同操作的 PHP 代码如下。我没有包括基于 Sphinx 的部分,因为我认为它们不相关(只知道我们得到了一个 ID 列表)因为我已经尝试在命令行上向 Mongo 提供完全相同的列表并得到正确的结果,而我不是来自 PHP。希望这是有道理的。

我使用的 PHP 代码如下所示:

$objMongo = new Mongo();
$objDB = $objMongo->words;

$arrWordList = array();

$strMap = '
function() {
if (this.words) {
for (index in this.words) {
emit(index, this.words[index]);
}
}
}
';

$strReduce = '
function(key, values) {
var total = 0;
for (var i in values) {
total += values[i];
}
return total;
}
';

$objMapFunc = new MongoCode($strMap);
$objReduceFunc = new MongoCode($strReduce);
$arrQuery = array(
'_id' => array('$in' => $arrIDs) // <--- list of IDs from Sphinx
);
$arrCommand = array(
'mapreduce' => 'wordsX',
'map' => $objMapFunc,
'reduce' => $objReduceFunc,
'query' => $arrQuery
);

MongoCursor::$timeout = -1;

$arrStatsInfo = $objDB->command($arrCommand);

var_dump($arrStatsInfo);

result-info数组($arrStatsInfo)在工作和非工作条件下(如上指定的过滤)的内容如下。

工作成果:

array(4) {
["result"]=>
string(31) "tmp.mr.mapreduce_1279637336_227"
["timeMillis"]=>
int(171)
["counts"]=>
array(3) {
["input"]=>
int(54)
["emit"]=>
int(2517)
["output"]=>
int(1526)
}
["ok"]=>
float(1)
}

空结果:

array(4) {
["result"]=>
string(31) "tmp.mr.mapreduce_1279637381_228"
["timeMillis"]=>
int(21)
["counts"]=>
array(3) {
["input"]=>
int(0)
["emit"]=>
int(0)
["output"]=>
int(0)
}
["ok"]=>
float(1)
}

所以看起来在损坏的情况下,甚至没有记录进入 MapReduce。我花了很长时间试图弄清楚这里到底发生了什么,但到目前为止我没有任何见解。正如我所说,使用完全相同的一组 ID 直接在 Mongo 命令行中运行相同的命令(如上所述)会返回正确的结果。

毕竟,我想我的问题是:我在上面进行的 PHP-Mongo 交互是否有明显的错误?我可以采取其他步骤来尝试对此进行调试吗?

如果提供任何进一步的信息会有帮助,请告诉我。我很欣赏这是一个有点广泛且定义不明确的问题,但我已尽力传达这个问题!真的希望有人能提出解决这个问题的方法。

非常感谢阅读!

最佳答案

对于 future 的读者来说,这个问题原来是应用程序其他地方对整数/数字字符串处理不一致的结果。对不起,红鲱鱼!

关于php - MongoDB MapReduce 在 PHP 中不返回任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com