【问题标题】:Fastest way to query huge list in mongodb在 mongodb 中查询巨大列表的最快方法
【发布时间】:2016-11-26 03:49:12
【问题描述】:

我想从 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)

我想得到禁食的方法。

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

【问题讨论】:

  • 你能补充一些关于 db.collection 结构的细节吗?这样会更容易提供帮助。

标签: python mongodb performance search pymongo


【解决方案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:您可能应该首先考虑在“userId”上添加索引,例如:

db.collection.ensure_index('userId')

【讨论】:

    【解决方案2】:

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

    希望对你有帮助!

    【讨论】:

    • 感谢 Puran 的帮助。
    • 如果您认为它有帮助,您应该接受答案:)
    猜你喜欢
    • 2010-10-27
    • 2018-12-11
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2021-01-09
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多