1

谁能告诉我存储与单个 mongo 文档相关的多个图像的最佳方法?

我的用例是我在“个人资料”集合中有一个“用户”文档。该文档包含有关用户的元数据(电子邮件地址、电话号码..)。
然后我们就可以上传多张关于用户的图片。

我们正在使用 GridFS 将图像存储在 files 集合中,我从 GridFS 取回上传图像的 id。

将该图像对象与上传它的用户对象相关联的最佳方法是什么?我可以将用户的 ObjectID 放在图像对象的元数据中……或者我可以将 ObjectID 放在用户文档中(并创建图像集合)。

我们正在使用 C# 驱动程序……所以如果有人有我的用例的任何示例……那就太好了。

谢谢MJD

4

3 回答 3

4

我会在用户文档中存储一组DBRefs 以创建更强的关联。除了图像的唯一 ID 之外,这还为关联(即目标集合)提供了更多上下文。

至于将 ID 存储在图像中,出于以下几个原因,我会跳过它:

  • 您不希望必须不断维护双重参考。虽然由于文档数据库的脱节性质,这有时是必要的,但这种关联很容易从反向查找中推断出来。
  • 索引用户对象中的引用数组将通过简单的反向查找从图像中获取用户信息。这是一个微不足道的查询,将导致可忽略不计的开销(如果有的话)。

如果需求发生变化以允许单个图像代表多个用户,则只有单向松散关联有助于使您的实现面向未来。

于 2011-04-07T03:59:12.660 回答
2
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; }


    }


}
于 2012-05-18T02:06:01.683 回答
1

我同意@Jake,不需要在图像中存储 userId。

我不仅喜欢ObjectId在用户文档中存储图像集合,还喜欢存储更多信息(如文件名、mb 一些元数据)。

使用这种方法,如果您想显示有关用户下载的信息(文件名、文件链接),则无需按 id 加载文件。

所以我建议这样的架构:

User { _id, 
       .., 
       Images {
               ImageId, 
               ImageName, 
               .. }
     }
于 2011-04-07T08:11:49.993 回答