如何使用id列表mapReduce Twitter实体?

时间:2013-11-20 16:33:22

标签: mongodb twitter mapreduce

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
}
}

导致这种情况的原因是什么?如何获得一个很好的值列表?

0 个答案:

没有答案