【问题标题】:Python Mongodb sorting too big, how to use index?Python Mongodb排序太大,如何使用索引?
【发布时间】:2020-04-19 14:36:24
【问题描述】:

我正在尝试在 Python 中迭代大型 Mongodb 数据库的所有元素。

通常,我会这样做:

mgclient = MongoClient('mongodb://user:pwd@0.0.0.0:27017')
mgdb = mgclient['mongo']
mgcol = mgdb['name']
for mg_ob in mgcol.find().sort('Date').sort('time'):
    #DOTHINGS

但它显示“排序操作使用的 RAM 超过了最大 33554432 字节。添加索引,或指定更小的限制”。

所以我创建了一个名为“SortedTime”的索引,但我现在不明白如何使用它。

基本上,我想拥有类似的东西:

mgclient = MongoClient('mongodb://user:pwd@0.0.0.0:27017')
mgdb = mgclient['mongo']
mgcol = mgdb['name']
for mg_ob in mgcol.find()['SortedTime']:
    #DOTHINGS

有什么想法吗?小手将不胜感激。

我希望这篇文章对其他人有所帮助。非常感谢

更新: 感谢乔,我设法使它工作。创建索引后:

resp = mgcol.create_index(
[
("date", 1),
("time", 1)
]
)

print ("index response:", resp)

我所做的只是:

mgclient = MongoClient('mongodb://user:pwd@0.0.0.0:27017')
mgdb = mgclient['mongo']
mgcol = mgdb['name']
for mg_ob in mgcol.find():
    #DOTHINGS

不需要使用索引名称。

【问题讨论】:

    标签: python mongodb loops indexing


    【解决方案1】:

    您的查询正在对两个字段进行排序,Datetime,因此您需要一个在键规范中首先包含这些字段的索引。

    在 mongo shell 中工作,您可以使用 createIndex shell 助手:

    db.getSiblingDB("mongo").getCollection("name").createIndex({Date:1, time:1})
    

    从客户端工作,您可以使用createIndexes 数据库命令。

    创建索引后,像以前一样查询,mongod 的查询执行器应该使用索引。

    您可以使用explain() 获取详细的查询执行阶段,以查看考虑了哪些索引以及每个索引的比较性能。

    【讨论】:

    • 嗨,乔,非常感谢您的回答。我创建的索引使用 2 个字段。我仍然不明白我应该如何使用它? mgcol = mgdb['SortedTime'] 这种方式(不起作用)?
    • 我明白了!发布答案。谢谢你的时间:)
    猜你喜欢
    • 2012-01-16
    • 2016-07-08
    • 2011-09-16
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多