繁体   English   中英

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

[英]Fastest way to query huge list in mongodb

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

  1. 将列表分为几组并获取数据

groups_of_list包含一串10000的userId列表

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

我想禁食方法。

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

恕我直言,您应该按照您指出的方法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')

您可以使用具有固定限制的游标,并使用游标遍历结果。 您可以在这里找到更多信息-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/

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM