pymongo - mongo文件bson数组的大小

时间:2017-09-08 18:52:03

标签: python mongodb pymongo

我正在尝试使用pymongo捕获数组大小(以字节为单位的bson大小)。以下是示例文档结构

enter image description here

我可以使用以下代码段

检索整个文档大小
for doc in src_db.src_coll.find({'customProperties':{ '$exists' : True }}).limit(2):
    print(len(bson.BSON.encode(doc)))

但是我无法计算每个子数组的大小,示例代码是失败的,

for doc in src_db.Quotes.find({'customProperties':{ '$exists' : True }}).limit(1):
    print('doc_size:'+str(len(bson.BSON.encode(doc))))
    doc_customProp =  doc["customProperties"]
    print('custom_prop_size:'+str(len(bson.BSON.encode(doc_customProp))))

输出错误:

doc_size: 363953
Traceback (most recent call last):
  File "./document_stats.py", line 15, in <module>
    print('custom_prop_size:'+str(len(bson.BSON.encode(doc_customProp))))
  File "/usr/lib64/python2.7/site-packages/bson/__init__.py", line 976, in encode
    return cls(_dict_to_bson(document, check_keys, codec_options))
TypeError: encoder expected a mapping type but got: [[u'custValue', u'{"identifier":"","productId":["3"]}']]

预期产出:

doc_size: 363953
custom_prop_size: *****

1 个答案:

答案 0 :(得分:0)

您应该可以使用以下投影来限制从MongoDB中获得的内容:

src_db.Quotes.find({'customProperties':{ '$exists' : True }}, {"_id": 0, "customProperties": 1})

然后您可以简单地获得整个文档的大小。