Получить все документы с помощью GridFSOperations

1

Я решил перенести один из наших проектов из PostgreSQL в MongoDB, и этот проект касается изображений. Я могу сохранить изображения и получить их с помощью _id сейчас, но я не смог найти функцию с GridFSOperations, где я мог бы безопасно получить все документы. Я делаю это так, что я мог бы сфотографировать метаданные, которые я сохранил с изображением, и проиндексировать их с помощью Lucene (поскольку мне нужен полный текстовый поиск по некоторым соответствующим метаданным, а также будущие возможные сценарии, где нам может понадобиться перестроить индекс Lucene)

В старом коде у меня просто была функция со смещением и лимитом для SQL-запроса, как я узнал (трудный путь), что наша dev-система может делать только объемную добавку Lucene в группах по 5k. Есть ли эквивалентный способ сделать это с помощью GridFS?

Редактировать:

функция, унаследованная от старого интерфейса:

public List<Photo> getPublicPhotosForReindexing(long offset, long limit) {
    List<Photo> result = new ArrayList<>();
    List<GridFSDBFile> files = gridFsOperations.find(new Query().limit((int) limit).skip((int) offset));
    for(GridFSDBFile file:files) {
        result.add(convertToPhoto(file));
    }
    return result;
}

простой конвертер, занимающий части метаданных и помещающий его в POJO, я сделал:

private Photo convertToPhoto(GridFSDBFile fsFile) {
    Photo resultPhoto = new Photo(fsFile.getId().toString());
    try {
        resultPhoto
                .setOriginalFilename(fsFile.getFilename())
     //         .setPhotoData(IOUtils.toByteArray(fsFile.getInputStream()))
                .setDateAdded(fsFile.getUploadDate());
    } catch (Exception e) {
        logger.error("Should not hit this one", e);
    }
    return resultPhoto;
}
Теги:
spring
gridfs

1 ответ

1
Лучший ответ

Когда вы используете GridFS, информация хранится в вашей базе данных MongoDB в двух коллекциях. Первый - fs.files который имеет основную ссылку на файл и fs.chunks которые фактически содержат "куски" данных. См. Примеры

Коллекция: fs.files

{
    "_id" : ObjectId("53229d20f3dde871df8b89a7"),
    "filename" : "receptor.jpg",
    "chunkSize" : 262144,
    "uploadDate" : ISODate("2014-03-14T06:09:36.462Z"),
    "md5" : "f1e71af6d0ba9c517280f33b4cbab3f9",
    "length" : 138905
}

Коллекция: fs.chunks

{
    "_id" : ObjectId("53229d20824b12efe88cc1f2"),
    "files_id" : ObjectId("53229d20f3dde871df8b89a7"),
    "n" : 0,
    "data" : // all of the binary data

}

Так что это действительно нормальные документы MongoDB и обычные коллекции.

Как вы можете видеть, существуют различные способы "запросить" эти коллекции со стандартным API:

  • Идентификатор объекта является монотонным и, следовательно, постоянно увеличивается. Новые записи будут иметь более высокое значение ObjectId, чем более старые. Самое главное, последний идентификатор, который был проиндексирован.

  • В updloadDate также содержится общая метка даты, которую вы можете использовать для запросов на основе диапазона дат.

Итак, вы видите, что GridFS - это просто "магия уровня драйвера" для работы с обычными документами MongoDB и обработки двоичных данных как одного документа.

Поскольку они являются обычными коллекциями с нормальными документами, если вы не извлекаете или иным образом не обновляете контент, просто используйте обычные методы для выбора и поиска.

  • 0
    Я попытался добавить запрос к нулю для лимита и пропустить, который я нашел, просматривая документы (я должен был сделать это раньше, я думаю), но я все еще получаю все 7-8 документов вместо 2 в пределе, которое я прошло. Будут ли работать .limit и .skip только в том случае, если будут добавлены действительные критерии?
  • 0
    @CidImmacula Дело в том, что вам не нужно использовать методы GridFS только для доступа к данным. С помощью стандартного .find() и всех .find() вас опций запроса и курсора данные находятся в стандартных коллекциях. Это позволяет вам выбрать то, что вам нужно. Ваша реализация драйвера «может» поддерживать все это через функции GridFS, но если это не так, то вам это не нужно, кроме как для чтения / записи / удаления содержимого файла.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню