RepoBSON RepoBSON::cloneAndShrink() const { std::set<std::string> fields; std::unordered_map< std::string, std::pair<std::string, std::vector<uint8_t>>> rawFiles(bigFiles.begin(), bigFiles.end()); std::string uniqueIDStr = hasField(REPO_LABEL_ID) ? UUIDtoString(getUUIDField(REPO_LABEL_ID)) : UUIDtoString(generateUUID()); getFieldNames(fields); RepoBSON resultBson = *this; for (const std::string &field : fields) { if (getField(field).type() == ElementType::BINARY) { std::string fileName = uniqueIDStr + "_" + field; rawFiles[field] = std::pair<std::string, std::vector<uint8_t>>(fileName, std::vector<uint8_t>()); getBinaryFieldAsVector(field, &rawFiles[field].second); resultBson = resultBson.removeField(field); } } return RepoBSON(resultBson, rawFiles); }