我想从mongodb获取大量用户的详细信息。 用户列表超过10万。 由于mongodb不能一次性支持非常庞大的数据查询。 我想知道哪种方法可以获取数据。
groups_of_list包含groupId的列表,其中包含10000个
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)
我想获得禁食方法。
如果有更好的方法/方法,请指出。
答案 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/
希望它有所帮助!