将文档插入MongoDB上的集合时,如何处理文档大小超过16MB错误

时间:2018-01-04 10:50:13

标签: mongodb python-2.7

任何人都可以建议在将文档插入MongoDB的集合时如何处理文档大小超过16MB的错误。我得到了像GridFS这样的解决方案。通过使用GridsFS可以处理这个问题,但我需要一个不使用GridFS的解决方案。有没有办法使文档更小或拆分为子文档。如果是,我们怎样才能实现?

from pymongo import MongoClient

conn = MongoClient("mongodb://sample_mongo:27017")
db_conn = conn["test"]
db_collection = db_conn["sample"]

# the size of record is 23MB

record = { \
    "name": "drugs",
    "collection_id": 23,
    "timestamp": 1515065002,
    "tokens": [], # contains list of strings
    "tokens_missing": [], # contains list of strings
    "token_mapping": {} # Dictionary contains transformed tokens
 }

db_collection.insert(record, check_keys=False)

我收到错误 DocumentTooLarge:BSON文件太大。在MongoDB中,最大BSON文档大小为16兆字节。

  File "/usr/local/lib/python2.7/dist-packages/pymongo-3.5.1-py2.7-linux-x86_64.egg/pymongo/collection.py", line 2501, in insert
check_keys, manipulate, write_concern)
  File "/usr/local/lib/python2.7/dist-packages/pymongo-3.5.1-py2.7-linux-x86_64.egg/pymongo/collection.py", line 575, in _insert
check_keys, manipulate, write_concern, op_id, bypass_doc_val)
  File "/usr/local/lib/python2.7/dist-packages/pymongo-3.5.1-py2.7-linux-x86_64.egg/pymongo/collection.py", line 556, in _insert_one
check_keys=check_keys)
  File "/usr/local/lib/python2.7/dist-packages/pymongo-3.5.1-py2.7-linux-x86_64.egg/pymongo/pool.py", line 482, in command
self._raise_connection_failure(error)
  File "/usr/local/lib/python2.7/dist-packages/pymongo-3.5.1-py2.7-linux-x86_64.egg/pymongo/pool.py", line 610, in _raise_connection_failure
raise error
  DocumentTooLarge: BSON document too large (22451007 bytes) - the connected server supports BSON document sizes up to 16793598 bytes.

2 个答案:

答案 0 :(得分:1)

快速回答是否定的,你无法绕过16 MB的BSON大小限制。如果达到此限制,则需要探索替代方案,例如GridFS或文档的不同架构设计。

我首先会问一系列问题来确定您的设计重点,例如:

  1. 您有tokenstokens_missingtoken_mapping字段。我想这些字段非常大,将所有三个字段放在一个文档中会将其推向> 16 MB。是否可以将此文档拆分为三个集合?

  2. 您的应用程序的访问模式是什么?您需要一直访问哪个字段?您经常访问哪个字段?您可以根据这些模式将文档拆分为不同的集合。

  3. 请记住需要索引文档,因为MongoDB的性能与支持查询的良好索引密切相关。您不能在一个索引中索引两个数组。 Multikey Indexes中有更多信息。

  4. 如果您需要在查询中组合所有相关数据,MongoDB 3.2及更新版本将为您提供$lookup operator,类似于SQL的左外连接。

  5. 与SQL的常规表单架构设计不同,MongoDB的架构设计基于应用程序的访问模式。 16 MB的限制是让你知道设计可能不是最佳的,因为这样的大型文档会对性能有害,难以更新等。通常情况下,拥有大量小文档而不是少数文档会更好巨大的文件。

    可以在Data Model DesignData Model Examples and Patterns中找到更多示例。

答案 1 :(得分:0)

最大BSON文档大小为16兆字节。为了存储大于最大大小的文档,MongoDB提供了GridFS API

GridFS是用于存储和检索超过BSON文档大小限制为16 MB的文件的规范。 GridFS通过将大文档分成部分或块来存储它们。每个块都存储在单独的文档中。 GridFS块的默认大小为255 KB。 GridFS使用两个集合来存储文件。一个集合存储文件块,另一个存储文件元数据。