0

在 MongoDB 中保存 500 多个 Facebook 朋友需要很长时间,我认为我做错了。我将粘贴我如何进行插入:

模型.js:

Friends = new Meteor.Collection('friends');
Friend = {
set : function(owner, friend) {
    var user_id = get_user_by_uid(friend['uid']);
    return Friends.update({uid: friend['uid'], owner: owner}, {$set:{
        name : friend['name'],
        pic_square : 'https://graph.facebook.com/'+friend['uid']+'/picture?width=150&height=150',
        pic_cover : friend['pic_cover'],
        uid : friend['uid'],
        likes_count : friend['likes_count'],
        friend_count : friend['friend_count'],
        wall_count : friend['wall_count'],
        age : get_age(friend['birthday_date']),
        mutual_friend_count : friend['mutual_friend_count'],
        owner : owner,
        user_id : user_id ? user_id['_id'] : undefined
    }}, {upsert: true});
}
}

server.js:

// First get facebook list of friends   
friends = friends['data']['data'];

_.each(friends, function(friend){
    Friend.set(user_id, friend);
});

超过 2 个用户的负载很高,并且需要很长时间才能插入数据库。我应该在这里改变什么?

4

1 回答 1

4

我认为性能不好有两个原因。

首先,您在客户端上体验的是minimongo性能,而不是mongodb性能。minimongo不能索引,所以upsert很昂贵——O(n^2)数据库大小很昂贵。只需if (Meteor.isSimulation) return;在数据库更新之前将语句添加到模型中即可。

查看一些示例代码以了解如何组织您的代码,因为Friend.set(user_id, friend)应该发生在方法调用中,通常在您的model.js. 然后,如果检测到它是模拟调用的客户端,而不是执行它的服务器,它应该逃逸。

其次,您正在使用uidowner喜欢一把钥匙,但没有把它们变成钥匙。在您的服务器启动代码中,添加Friends._ensureIndex({uid:1, owner:1}).

如果这些都不起作用,那么您对 ​​Facebook 的查询可能会以某种方式受到速率限制。

查看https://stackoverflow.com/a/8805436/1757994以讨论如果您受到速率限制,您将收到的错误消息。

他们几乎肯定不希望您按照自己的方式复制图表。您可能要考虑根本不复制图表,而仅在使用的基础上获取数据,因为无论如何它很快就会变得陈旧。

于 2013-01-22T17:20:33.537 回答