Mongodb: игнорировать большие документы (BSON> 16 МБ) во время сбора.aggregate()

mongodb #pymongo

#mongodb #pymongo

Вопрос:

Я просматриваю коллекцию mongodb, в которой есть большие документы, содержащие bson размером более 16 МБ. По сути, я вызываю любой из 2 в зависимости от флага для случайной выборки:

 documents = collection.aggregate(
                [{"$sample": {"size": sample_size}}], allowDiskUse=True)
 

или

 documents = collection.aggregate(
                [{"$limit": sample_size}], allowDiskUse=True)
 

sample_size здесь является параметром.

Проблема в том, что эта команда застревает на несколько минут над большими bson, а затем в конечном итоге mongodb прерывает выполнение, и мое сканирование всей коллекции не завершено.

Есть ли способ указать mongodb пропускать / игнорировать документы, размер которых превышает пороговое значение?

 For those who think that MongoDB cannot store values larger than 16 MB, here is the error message by a metadata collector (LinkedIn DataHub):

OperationFailure: BSONObj size: 17375986 (0x10922F2) is invalid. 
Size must be between 0 and 16793600(16MB) First element: _id: "Topic XYZ",
full error: {'operationTime': Timestamp(1634531126, 2), 'ok': 0.0, 'errmsg': 'BSONObj size: 17375986 (0x10922F2) is invalid. Size must be between 0 and 16793600(16MB) 
 

Комментарии:

1. Вы не можете хранить документы размером более 16 Мбайт. Ваш запрос не имеет никакого смысла.

2. Для хранения документов, размер которых превышает максимальный размер, MongoDB предоставляет API GridFS. Дополнительные сведения о GridFS см. в mongofiles и документации к вашему драйверу. docs.mongodb.com/manual/reference/limits

3. @WernfriedDomscheit Тогда как насчет этого сообщения об ошибке, сообщаемого инструментом сканирования документов MongoDB: Ошибка операции: BSONObj размер: 17375986 (0x10922F2) недопустим. Размер должен быть от 0 до 16793600 (16 МБ)

4. Это ваш полный конвейер агрегации? Простой выбор коллекции collection ?

Ответ №1:

Максимальный размер документа — 16 МБ см.
(Исключением является спецификация GridFS)

В вашей коллекции размер каждого документа уже составляет <16 МБ, MongoDB не позволяет нам хранить документы большего размера.

Если вы хотите отфильтровать, допустим, <10 МБ
Вы можете использовать оператор «$ bsonSize», чтобы получить размер документа и отфильтровать большие.