gpt4 book ai didi

javascript - MongoDB MapReduce 显示 "[object Object]"作为键,尽管针对它们进行了类型检查

转载 作者:行者123 更新时间:2023-12-02 18:45:28 24 4
gpt4 key购买 nike

我正在尝试在 Mongo 中使用 mapReduce 来计算给定值出现的次数。

这是我的 map 函数,我在其中进行测试以确保每个值都是字符串:

function mapFunction () {
function normalizeDate(date) {
var day = date.getDay(),
month = date.getMonth(),
year = date.getYear();
return new Date(year, month, day);
}

if (this.events.event.toString() === "[object Object]"
|| typeof(this.events.event) !== 'string') {
throw new Error("Not a string...");
}

emit(normalizeDate(this.date), this.events.event);
}

为了完整起见,这是我的归约函数:

function reduceFunction (date, event_arry) {
return event_arry.reduce(function (a, b) {
if (a[b]) {
a[b]++;
}
else {
a[b] = 1;
}
return a;
}, {});
}

然后,我在 mongo repl 中运行 mapReduce:

mongos> db.events.mapReduce(mapFunction, reduceFunction, {out: 'mr_test'})
{
"result" : "mr_test",
"timeMillis" : 148,
"counts" : {
"input" : 3481,
"emit" : 3481,
"reduce" : 82,
"output" : 14
},
"ok" : 1,
}

并且没有错误,表明所有事件都是字符串类型。

然而,当我查看 mr_test 集合中的输出时,我得到了几个如下条目:

mongos> db.mr_test.find()
{ "_id" : ISODate("0113-04-05T00:00:00Z"), "value" : { "[object Object]" : 4 } }
{ "_id" : ISODate("0113-04-06T00:00:00Z"), "value" : { "[object Object]" : 5 } }
{ "_id" : ISODate("0113-04-30T00:00:00Z"), "value" : { "[object Object]" : 1, "eventTypeA" : 9, "eventTypeB" : 14, "eventTypeC" : 19 } }

对此有好的解释吗?如果是的话,那是什么?

最佳答案

对此有一个很好的解释(这与 MongoDB mapreduce 99% 的问题都是一样的。您的映射值与您的reduce 返回的格式不同。

您的reduce函数必须返回与map函数发出的格式相同的格式。

您正在发出一个字符串,并且希望返回一个文档!您需要做的是在 map 函数中发出您期望的确切格式:

emit(normalizeDate(this.date), {this.events.event:1} );

这表示:“对于特定的一天(键),我正在跟踪单个事件字符串,其总数为 1”。

然后调整您的reduce函数以迭代值数组,将其合并在一起,请记住,由于可以多次调用reduce函数(以重新减少特定键的结果),因此您要“合并”或减少的文档可以是单个 {date:number} 或包含多个 {date1:number, date2: number, ... }的复杂文档

关于javascript - MongoDB MapReduce 显示 "[object Object]"作为键,尽管针对它们进行了类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16436658/

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