1

1 つの mongo ドキュメントに関連する複数の画像を保存する最良の方法を誰か教えてもらえますか?

私のユースケースは、「プロファイル」コレクションに「ユーザー」ドキュメントがあることです。このドキュメントには、ユーザーに関するメタデータ (電子メール アドレス、電話番号など) が含まれています。
次に、ユーザーに関する複数の画像をアップロードできます。

ファイル コレクションに画像を保存するために GridFS を使用しています。アップロードされた画像の ID を GridFS から取得します。

その画像オブジェクトを、それをアップロードしたユーザー オブジェクトに関連付ける最良の方法は何ですか? ユーザーの ObjectID を Image オブジェクトのメタデータに入れることができます….または ObjectID を User Doc に入れる (そして画像のコレクションを作成する) ことができます。

私たちは C# ドライバーを使用しています…私のユースケースの例があれば…それは素晴らしいことです。

ありがとうございます

4

3 に答える 3

4

DBRefの配列をユーザーのドキュメントに格納して、より強力な関連付けを作成します。これにより、画像の一意の ID だけでなく、関連付け (つまり、ターゲット コレクション) により多くのコンテキストが提供されます。

画像に ID を保存することについては、いくつかの理由でスキップします。

  • 二重参照を常に維持する必要はありません。これは、ドキュメント データベースのバラバラな性質のために必要になる場合もありますが、関連付けは逆ルックアップから簡単に推測できます。
  • ユーザー オブジェクト内の参照の配列にインデックスを付けると、単純な逆引き検索で画像からユーザー情報が取得されます。これは単純なクエリであり、無視できるオーバーヘッド (存在する場合) が発生します。

一方向の緩やかな関連付けのみを使用することで、1 つのイメージで複数のユーザーを表すことができるように要件が変更された場合に、実装を将来的に保証するのに役立ちます。

于 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

userIdを画像に保存する必要がないという@Jakeに同意します。

ユーザードキュメントに画像のコレクションだけでなくObjectId、その他の情報 (ファイル名、mb メタデータなど) も保存するのが好きです。

このようなアプローチを使用すると、ユーザーのダウンロードに関する情報 (ファイル名、ファイルへのリンク) を表示する場合、ID でファイルをロードする必要はありません。

だから私はこのようなスキーマを提案します:

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