TL; DR 我的MapReduce没有正确地将_ids列为值,但创建了多个数组。有什么帮助吗?
全文
我有一个充满推文的集合,包括实体。我感兴趣的数据部分看起来像这样:
{
"_id": ObjectId("h98342jdhs99191"),
"text": "tweet text",
"screen_name":"twittername",
"entities":{
media:[
{
"type":"photo",
"media_url":"http://wwww.twitpic.com/HzKd99.jpg"
},
{
"type":"photo",
"media_url":"http://wwww.twitpic.com/HDK43.jpg"
}
]
}
}
输出的关键应该是media_url。因为一个url可以由多个人发推文,我希望该值是一个包含tweep id的数组。像这样:
{
"_id": "http://www.foto.com/kdh34a.jpg",
"value":{
{ id:ObjectId("854737272343f8928") },
{ id:ObjectId("23137272378uie8928") },
{ id:ObjectId("85473727fdsd4x77665") },
{ id:ObjectId("8547372723dsd411zzc") }
}
}
我创建了以下MapReduce函数:
map = function(){
if(!this.entities.media){
return;
}
for(index in this.entities.media){
emit(this.entities.media[index].media_url, {ids: [this._id]});
}
}
reduce = function(key, values){
var result = {};
for(id in values){
if(!values.indexOf(values[id])){
Array.prototype.push.apply(result, values);
}
}
return result;
}
db.tweets.mapReduce(map, reduce, {out: "media"});
当media_url是唯一的时,结果如下:
{
"_id" : "http://wwww.twitpic.com/HzKd99.jpg",
"value" : {
"ids" : [
ObjectId("528748b423421150010021fd")
]
}
}
当它不独特时,结果会变得奇怪:
{
"_id" : "http://wwww.twitpic.com/HzKd99.jpg",
"value" : {
"0" : {
"0" : {
"ids" : [
ObjectId("528733ac234211500100004f")
]
},
"1" : {
"ids" : [
ObjectId("52873c772342115001000d8d")
]
},
"2" : {
"ids" : [
ObjectId("52873e142342115001001017")
]
},
"3" : {
"ids" : [
ObjectId("5287545a2342115001004fd3")
]
},
"length" : 4
},
"1" : {
"ids" : [
ObjectId("5287c43b2342115001010e53")
]
},
"length" : 2
}
}
导致这种情况的原因是什么?如何获得一个很好的值列表?