我想计算存储在mongodb bson文件中的文档数,而不必通过mongo restore将文件导入到db中.
我能够在python中提出的最好的方法是
bson_doc = open('./archive.bson','rb')
it = bson.decode_file_iter(bson_doc)
total = sum(1 for _ in it)
print(total)
从理论上讲,这是可行的,但是当bson文档很大时,在实践中就很慢.任何人都可以在不进行完整解码的情况下更快地计算bson文档中文档的数量?
我目前正在使用python 2.7和pymongo.
https://api.mongodb.com/python/current/api/bson/index.html
解决方法:
我没有手头的文件,但我相信有办法-如果您要手动解析数据.
source for bson.decode_file_iter
(没有文档字符串)如下所示:
_UNPACK_INT = struct.Struct("<i").unpack
def decode_file_iter(file_obj, codec_options=DEFAULT_CODEC_OPTIONS):
while True:
# Read size of next object.
size_data = file_obj.read(4)
if len(size_data) == 0:
break # Finished with file normaly.
elif len(size_data) != 4:
raise InvalidBSON("cut off in middle of objsize")
obj_size = _UNPACK_INT(size_data)[0] - 4
elements = size_data + file_obj.read(obj_size)
yield _bson_to_dict(elements, codec_options)
我想,耗时的操作是_bson_to_dict调用-您不需要一个.
因此,您所需要做的就是读取文件-获取具有下一个文档大小的int32值并跳过它.然后计算执行此操作时遇到的文档数.
因此,我相信,此功能应该可以解决问题:
import struct
import os
from bson.errors import InvalidBSON
def count_file_documents(file_obj):
"""Counts how many documents provided BSON file contains"""
cnt = 0
while True:
# Read size of next object.
size_data = file_obj.read(4)
if len(size_data) == 0:
break # Finished with file normaly.
elif len(size_data) != 4:
raise InvalidBSON("cut off in middle of objsize")
obj_size = struct.Struct("<i").unpack(size_data)[0] - 4
# Skip the next obj_size bytes
file_obj.seek(obj_size, os.SEEK_CUR)
cnt += 1
return cnt
(不过,我尚未测试过代码.手头没有MongoDB.)
标签:mongodb,bson,python 来源: https://codeday.me/bug/20191118/2026516.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。