![](/img/trans.png)
[英]Fastest way of checking for word in huge list of keywords - Python performance
[英]Fastest way to query huge list in mongodb
我想从mongodb获取大量用户的详细信息。 用户列表超过10万。 由于mongodb无法一次性支持非常庞大的数据查询。 我想知道哪种是获取数据的最佳方法。
groups_of_list包含一串10000的userId列表
for group in groups_of_list: curr_data = db.collection.find({'userId': {'$in': group}}) data.append(curr_data)
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.