【发布时间】:2012-05-30 13:54:11
【问题描述】:
我是 mongo db 的新手,如果这很琐碎,请原谅。我非常感谢您的帮助。
这个想法是在某些特定值上生成直方图。在这种情况下,某些文件的 mime 类型。为此,我正在使用 map reduce 作业。
我有一个文件格式如下的 mongo:
{
"_id" : ObjectId("4fc5ed3e67960de6794dd21c"),
"name" : "some name",
"uid" : "some app specific uid",
"collection" : "some name",
"metadata" : [
{
"key" : "key1",
"value" : "Plain text",
"status" : "SINGLE_RESULT",
},
{
"key" : "key2",
"value" : "text/plain",
"status" : "SINGLE_RESULT",
},
{
"key" : "key3",
"value" : 3469,
"status" : "OK",
}
]
}
请注意,几乎每个文档中都有更多元数据键值。
Map Reduce 作业
我尝试了以下操作:
function map() {
var mime = "";
this.metadata.forEach(function (m) {
if (m.key === "key2") {
mime = m.value;}
});
emit(mime, {count:1});
}
function reduce() {
var res = {count:0};
values.forEach(function (v) {res.count += v.count;});
return res;
}
db.collection.mapReduce(map, reduce, {out: { inline : 1}})
这似乎适用于少量文档(~15K),但问题是在映射阶段遍历所有元数据键值需要大量时间。在更多文档 (~1Mio) 上运行此操作时,该操作将永远进行。
所以我的问题是: 有什么方法可以直接发出 mime 类型(值),而不是遍历所有键并选择它?或者有没有更好的方法来编写 map reduce 函数。
类似 emit (this.metadata.value {$where this.metadata.key:"key2"}) 或类似的东西...
感谢您的帮助!
【问题讨论】:
标签: performance mongodb mapreduce