查询mongodb中巨大列表的最快方法

时间:2016-07-22 09:37:15

标签: python mongodb performance search pymongo

我想从mongodb获取大量用户的详细信息。 用户列表超过10万。 由于mongodb不能一次性支持非常庞大的数据查询。 我想知道哪种方法可以获取数据。

  1. 分组列表并获取数据
  2.   

    groups_of_list包含groupId的列表,其中包含10000个

    for group in groups_of_list:
        curr_data = db.collection.find({'userId': {'$in': group}})
        data.append(curr_data)
    
    1. 循环收集
    2. for doc in db.collection.find({}):
         if i['userId'] in set_of_userIds:
             data.append(doc)
      

      我想获得禁食方法。

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

2 个答案:

答案 0 :(得分:2)

恕我直言,你应该将其分成合理大小的"你指出的方法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:您应该考虑在' userId'上添加索引。首先,像:

db.collection.ensure_index('userId')

答案 1 :(得分:1)

您可以使用具有固定限制的游标,并使用游标迭代结果。您可以在此处找到更多信息 - https://docs.mongodb.com/v3.2/tutorial/iterate-a-cursor/

但实际的代码实现取决于您使用的语言。例如,如果它是Spring,Java应用程序,您可以使用Pageable请求,例如

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/

希望它有所帮助!