我有一个包含如下条目的集合:
{“userid”:1,“contents”:[{“tag”:“whatever”,“value”:100},{“tag”:“whatever2”,“value”:110}]}
我正在使用{“contents.tag”:“whatever”}等查询对此集合执行MapReduce。
我想在我的map函数中做的是发出对应于数组“contents”中与条目匹配的条目的“value”字段,而不必遍历整个数组 。在正常情况下,我可以使用$ positional运算符来执行此操作,例如内容。$。value。但是在MapReduce案例中,它无法正常工作。
总结一下,这是我现在的代码:`
map=function(){
emit(this.userid, WHAT DO I WRITE HERE TO EMIT THE VALUE I WANT ?);
}
reduce=function(key,values){
return values[0]; //this reduce function does not make sense, just for the example
}
res=db.runCommand(
{
"mapreduce": "collection",
"query": {'contents.tag':'whatever'},
"map": map,
"reduce": reduce,
"out": "test_mr"
}
);`
有什么想法吗?
谢谢!
答案 0 :(得分:0)
如果不迭代整个数组,这将无法工作。在MongoDB中,查询旨在匹配整个文档。
在处理Map / Reduce时,查询只是修剪传递到map
函数的文档数量。但是,map
函数不知道运行的查询。这两个是断开的。
M / R周围的源代码是here。
即将推出的聚合功能将更贴近这一愿望。但是这个功能没有时间表。
答案 1 :(得分:0)
没办法。我遇到了同样的问题。迭代是必要的。 你可以这样做:
map=function() {
for(var i in this.contents) {
if(this.contents[i].tag == "whatever") {
emit(this.userid, this.contents[i].value);
}
}
}