C # MongoDB Драйвер с GridFS - PullRequest
1 голос
/ 07 апреля 2011

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

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

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

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

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

Спасибо MJD

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

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

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

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

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

2 голосов
/ 18 мая 2012
using System;
using System.Collections.Generic;
using System.Linq; 
using System.Text;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using MongoDB.Bson;
using MongoDB.Driver.Builders;
using MongoDB.Driver.GridFS;
using System.IO;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            MongoServer ms = MongoServer.Create();
            string _dbName = "docs";

            MongoDatabase md = ms.GetDatabase(_dbName);
            if (!md.CollectionExists(_dbName))
            {
                md.CreateCollection(_dbName);
            }

            MongoCollection<Doc> _documents = md.GetCollection<Doc>(_dbName);
            _documents.RemoveAll();
            //add file to GridFS

            MongoGridFS gfs = new MongoGridFS(md);
            MongoGridFSFileInfo gfsi = gfs.Upload(@"c:\mongodb.rtf");
            _documents.Insert(new Doc()
            {
                DocId = gfsi.Id.AsObjectId,
                DocName = @"c:\foo.rtf"
            }
            );

            foreach (Doc item in _documents.FindAll())
            {

                ObjectId _documentid = new ObjectId(item.DocId.ToString());
                MongoGridFSFileInfo _fileInfo = md.GridFS.FindOne(Query.EQ("_id", _documentid));
                gfs.Download(item.DocName, _fileInfo);
                Console.WriteLine("Downloaded {0}", item.DocName);
                Console.WriteLine("DocName {0} dowloaded", item.DocName);

            }



            Console.ReadKey();
        }
    }

    class Doc
    {
        public ObjectId Id { get; set; }
        public string DocName { get; set; }
        public ObjectId DocId { get; set; }


    }


}
1 голос
/ 07 апреля 2011

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

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

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

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

User { _id, 
       .., 
       Images {
               ImageId, 
               ImageName, 
               .. }
     }
...