最近要用mongodb来取出用户的二度人脉,刚开始写了一个版本。

当然,最终还是要修改的,不过这个版本可以发上来。

先说简要的数据结构。

user:
{
  _id: ObjectId,
  follows: [{ObjectId}]
}

二度人脉就是提取某个user其follow的user的follow的集合(有点绕口)

首先是先获取单个user的follow列表,我命名为friends,然后执行

var o = {};
o.query = {_id: {$in : friends}};
o.map = function() {
    var u = this;
    this.follows.forEach(function(person) {
        emit(person.user_id, {via: u._id, count: 1});
    });
};
o.reduce = function(key, value) {
    var vias = [];
    value.forEach(function(user) {
        vias.push(user.via);
    });
    return {
        via: vias,
        count: vias.length
    };
};
User.mapReduce(o, function(err, model) {
    callback(err, model);
});

这样,user的二度人脉就得到了,并且返回对象包括中间人vias。

这是用mongose的写法,mongodb基本相同,可以试试。

@icymorn, 2015.04.0