2016-07-22 29 views
0

我想从mongodb中获取大量用户的详细信息。 用户列表超过10万。由于mongodb一次不支持非常庞大的数据查询。 我想知道哪些是获取数据的最佳方式。在基团查询mongodb中的巨大列表的最快方法

  1. 鸿沟列表,并获得数据

groups_of_list包含具有10000

for group in groups_of_list: 
    curr_data = db.collection.find({'userId': {'$in': group}}) 
    data.append(curr_data) 
  • 束用户id的列表循环收集
  • for doc in db.collection.find({}): 
        if i['userId'] in set_of_userIds: 
         data.append(doc) 
    

    我想要得到的禁食方法。

    如果有更好的方法/方法,请指出。

    +0

    你可以在db.collection的结构上添加一些细节吗?这将使得帮助变得更容易。 – learn2day

    回答

    1

    恕我直言,你应该把它分成“合理大小”的块,就像你指出的方法1一样,不是因为Mongo的限制,而是因为你自己的机器的内存限制。

    它可能应该是这样的:

    def get_user_slice_data(groups_of_list): 
        for group in groups_of_list: 
         yield list(db.collection.find({'userId': {'$in': group}})) 
    

    该发生器功能,可以像这样使用:

    for use_slice_data in get_user_slice_data(groups_of_list): 
        # do stuff 
    

    通过这样做,你将是既避免其数据的大金额在内存中,并减少Mongo交易的规模。

    PD:你应该考虑增加一个索引“用户id”第一,如:

    db.collection.ensure_index('userId') 
    
    0

    您可以使用游标与固定的限制和迭代使用光标的结果。你可以在这里找到更多的信息 - https://docs.mongodb.com/v3.2/tutorial/iterate-a-cursor/

    但是实际的代码实现取决于你使用的语言。如果是春天,例如,你可以使用可分页请求的Java应用程序,像

    Pageable pageable = new PageRequest(0, 50); 
    Query query = new Query(); 
    query.with(pageable); 
    
    mongoTemplate.find(query, User.class); 
    
    //get the next page 
    pageable = pageable.next(); 
    

    不过,千万记住,如果你正在更新您的数据你迭代它,它可能会产生不一致的结果。所以,在这种情况下,您必须使用快照进行查询。 https://docs.mongodb.com/manual/reference/method/cursor.snapshot/

    希望它有帮助!

    +0

    感谢Puran帮助。 –

    +0

    如果你认为它有帮助,你应该接受答案:) – Puran

    相关问题