Драйвер С# MongoDB с GridFS

Может ли кто-нибудь сказать мне, как лучше всего хранить несколько изображений, связанных с одним документом монго?

Мой вариант использования заключается в том, что у меня есть документ «пользователь» в коллекции «профиль». В этом документе есть метаданные о пользователе (адрес электронной почты, номер телефона..).
Затем у нас есть возможность загрузить несколько изображений о пользователе.

Мы используем GridFS для хранения изображений в коллекции файлов, и я получаю идентификатор загруженного изображения из GridFS.

Каков наилучший способ связать этот объект изображения с объектом пользователя, который его загрузил? Я могу поместить ObjectID пользователя в метаданные объекта изображения… или я могу поместить ObjectID в пользовательский документ (и создать коллекцию изображений).

Мы используем драйвер C#… так что если у кого-нибудь есть примеры моего варианта использования… было бы здорово.

Спасибо МЖД


person Matthew Drooker    schedule 07.04.2011    source источник


Ответы (2)


Я бы сохранил массив DBRef в документе пользователя, чтобы создать более сильную ассоциацию. Это дает больше контекста ассоциации (т. е. целевой коллекции) в дополнение к уникальному идентификатору изображения.

Что касается хранения идентификатора в образе, я бы пропустил его по нескольким причинам:

  • Вам не нужно постоянно поддерживать двойные ссылки. Хотя иногда это необходимо из-за разрозненной природы баз данных документов, ассоциацию легко вывести из обратного просмотра.
  • Индексация массива ссылок в пользовательском объекте даст вам информацию о пользователе из изображения с помощью простого обратного просмотра. Это тривиальный запрос, который приведет к незначительным накладным расходам (если таковые имеются).

Наличие только односторонней свободной ассоциации помогает защитить вашу реализацию в будущем, если требования когда-либо изменятся, чтобы позволить одному изображению представлять нескольких пользователей.

person Jake Wharton    schedule 07.04.2011

Я согласен с @Jake, что нет необходимости хранить идентификатор пользователя в изображении.

Мне нравится хранить в пользовательском документе не только коллекцию изображений ObjectId, но и дополнительную информацию (например, имя файла, некоторые метаданные).

При таком подходе вам не нужно загружать файлы по идентификаторам, если вы хотите отображать информацию о загрузках пользователем (имя файла, ссылка на файл).

Поэтому предлагаю такую ​​схему:

User { _id, 
       .., 
       Images {
               ImageId, 
               ImageName, 
               .. }
     }
person Andrew Orsich    schedule 07.04.2011
comment
Попался совершенно логичный... и я нахожусь в процессе внесения этого изменения. Еще один вопрос. Теперь, когда у меня есть DBRef, я получаю его с помощью var ImageRef = profileDB.FetchDBRef(user.Images[0].UserPhoto); Как получить дескриптор документа GridFS. Я бы подумал, что ImageRef даст мне поток... но это не так. Спасибо МЖД - person Matthew Drooker; 07.04.2011