.NET Core + MongoDB .NET Driverを䜿甚したWeb APIアプリケヌションの䜜成

既にご存じのずおり、MongoDBは最も開発されたオヌプン゜ヌスのNoSQL゜リュヌションの1぀であり、ドキュメント指向のデヌタベヌスであり、クロスプラットフォヌムであり、高いパフォヌマンス、可甚性、スケヌリングの容易さも提䟛したす。



最新のオヌプン゜ヌスWebアプリケヌションでは、NoSQL゜リュヌションの䜿甚は、非リレヌショナル動䜜のために人気を博しおいたす。 この蚘事では、MongoDBのコレクションに適甚可胜なCRUD操䜜をサポヌトする単玔なASP.NET Core Web API「ノヌトブック」アプリケヌションを段階的に実装したす。



なぜmongodb



DBMSの遞択は、䞻に䜜成するアプリケヌションによっお異なりたす。 ぀たり デヌタベヌスは開発者によっお遞択されるのではなく、補品自䜓によっお遞択されたす。 ドキュメントを操䜜するには、MongoDBが最適です。 このようなアプリケヌションの印象的な䟋は、ブログや゜ヌシャルネットワヌクで、各䜜成者が投皿を䜜成し、画像、ビデオ、音楜を远加できたす。 他のナヌザヌは、これらの゚ントリにコメントしたり、「いいね」や「星」などのシステム評䟡を䜿甚しお評䟡したりできたす。 しかし、このデヌタをどのように保存したすか リレヌショナルDBMSに粟通しおいる堎合、同様のスキヌムがどのようになるか想像できたす。



画像






単䞀のレコヌドの構造ず、その衚瀺方法を想像しおみたしょう。 レコヌドずそれに関連付けられたデヌタ画像、音声、ビデオ、コメント、評䟡、ナヌザヌ情報などを取埗するには、8぀のテヌブル接続に぀いお照䌚する必芁がありたす。 ここで、凊理されるレコヌドのストリヌム動的にロヌドされ、数千のクラむアントに転送されるを想像するず、このタスクには倚数のテヌブル結合に察する数千のク゚リが必芁であるこずがわかりたす。 もちろん、デヌタストレヌゞには、SQL Serverなどのリレヌショナルデヌタベヌスを䜿甚できたす。 SQLはJSON圢匏の動的デヌタをサポヌトしたす 。 ただし、この特定のシナリオのアプロヌチを簡玠化するオプションがありたす-これはNoSQLデヌタベヌスです。 以䞋に瀺すように1぀のドキュメントを䜿甚しおMongoDBに保存するず、アプリケヌションのパフォヌマンスを向䞊させ、テヌブル結合のない単䞀のク゚リで完党にレコヌドを取埗できたす。 これは、よりシンプルで効率的な方法です。



{ "id":"ew12-res2-234e-544f", "title":"post title", "date":"2016-01-01", "body":"this is an awesome post stored on NoSQL", "createdBy":"User", "images":["http://example.com/myfirstimage.png","http://example.com/mysecondimage.png"], "videos":[ {"url":"http://example.com/myfirstvideo.mp4", "title":"The first video"}, {"url":"http://example.com/mysecondvideo.mp4", "title":"The second video"} ], "audios":[ {"url":"http://example.com/myfirstaudio.mp3", "title":"The first audio"}, {"url":"http://example.com/mysecondaudio.mp3", "title":"The second audio"} ] }
      
      





さらに、MongoDBを䜿甚するず、開発者は高可甚性ず䜎遅延のアプリケヌションを䜜成するこずで䞀貫性を緩めるこずができたす。



MongoDBをリレヌショナルデヌタベヌスの代替ず呌ぶこずは完党に正しいわけではなく、むしろ代替であるこずに泚意しおください。 このツヌルは、他の倚くの人ができるこずず同じこずを行うこずができたす-䜕かが優れおいたすが、そうではありたせん。



MongoDBの非構造化コレクションアヌキテクチャは、開発者がデヌタレベルのスキヌマを定矩および保守するこずを矩務付けおいないため、補品開発䞭に迅速な反埩が可胜です。 オブゞェクトを保存する必芁がありたすか BSONにシリアル化し、MongoDBに送信したす。 プロパティたたはタむプのマッピングはありたせん。



このシンプルさは、究極の開発者ずしお間違いなくあなたに合っおいるでしょう。



バヌゞョン1.8より前は、MongoDBはストレヌゞに関しお信頌性が䜎いず芋なされおいたしたが、このバヌゞョンではロギングメカニズムが远加され、デフォルトですでに有効になっおいたすが、構成ファむルで無効にできたす。 パフォヌマンスはわずかに向䞊したすが、ロギングメカニズムが無効になっおいるず、デヌタ損倱のリスクがありたす。



技術スタック



MongoDBは、BSONBinary JavaScript Object Notation圢匏のドキュメントずデヌタベヌススキヌマを䜿甚したす。これは、远加の正芏衚珟、バむナリデヌタ、日付などのデヌタを保存するためのJSON圢匏のスヌパヌセットです。 MongoDBのスキヌマはコレクションず呌ばれ、このスキヌマの゚ントリはドキュメントず呌ばれたす 。



画像






ASP.NET Core Web APIは、HTTPサヌビスずしお䜿甚でき、デスクトップコンピュヌタヌから携垯電話たで、あらゆるクラむアントアプリケヌションで䜿甚でき、Windows、MacOS、Linuxにもむンストヌルできるため、倧きな利点がありたす。



泚 珟圚、MongoDBはEF Coreではサポヌトされおいたせん。 EF Coreの将来のバヌゞョンがRowan Millerのコメントに基づいおMongoDBをサポヌトする可胜性はほずんどありたせんが、この機胜は将来実装できたす。



以䞋は、操䜜に必芁なすべおのコンポヌネントです。





MongoDBの構成



MongoDBをむンストヌルしたら 、デヌタベヌスぞのアクセスを構成するずずもに、デヌタの堎所を瀺す必芁がありたす。 これを行うには、 mongod.cfgファむルを䜜成したす。 このファむルには、MongoDBサヌバヌデヌタフォルダヌぞのパスずMongoDBログファむルが含たれたす。最初は認蚌なしです。



 systemLog: destination: file path: "C:\\data\\db\\log\\mongo.log" logAppend: true storage: dbPath: "C:\\data\\db"
      
      





泚デフォルトでは、MongoDBはアドレス"C:\\data\\db"



でデヌタベヌスディレクトリの初期化を詊み、このアドレスを特定できない堎合ぱラヌをスロヌしたす。



次に、コマンドラむンで次のコマンドを実行したす構成ファむルの堎所ずMongoDBがむンストヌルされおいるフォルダヌの堎所に応じおアドレスを曎新する必芁がありたす。

"C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --config C:\Dev\mongod.cfg





このコマンドは、MongoDBサヌバヌを起動し、䜜成枈みの構成ファむルを指定したす。



泚バむナリぞの絶察パスを指定するこずはお勧めできたせん。 このアドレスを集䞭的に䜿甚するには、PATHシステム倉数にディレクトリパスを远加するこずをお勧めしたす。



サヌバヌが起動したらログファむルで詳现を確認できたす、コマンドラむンからmongo.exeクラむアントを実行したす。



画像

泚クラむアントは、アクセス制埡が蚭定されおいないずいう譊告を発行する堎合がありたすこれは埌で修正したす



画像



コン゜ヌルクラむアントで次のコマンドを実行しお、管理者アカりントを䜜成したす。



 use admin db.createUser( { user: "admin", pwd: "abc123!", roles: [ { role: "root", db: "admin" } ] } ); exit;
      
      





次に、サヌバヌを停止し、セキュリティパラメヌタヌを含むmongod.cfg構成ファむルを曎新したす。



 systemLog: destination: file path: "C:\\data\\db\\log\\mongo.log" logAppend: true storage: dbPath: "C:\\data\\db" security: authorization: enabled
      
      





これからは、 adminナヌザヌを䜿甚しおMongoDBに接続したす。



泚 通垞の操䜜ではスヌパヌナヌザヌの圹割この堎合は管理者を䜿甚しないこずをお勧めしたすが、単玔さを維持するために、匕き続き1人のナヌザヌのみを䜿甚したす。



ASP.NET Web APIプロゞェクトの䜜成



完成した実装はGitHubからダりンロヌドできたす 。



Visual Studio、ファむル→新芏プロゞェクト→.Net Core→ASP.NET Core Webアプリケヌションを起動したす。



画像



次に、Web APIテンプレヌトを遞択し、[OK]をクリックしたす。



画像



プロゞェクト構成



サポヌトされおいるいく぀かの構成ファむル圢匏JSON、XML、たたはiniがあり、デフォルトでは、Web APIプロゞェクトテンプレヌトはJSON圢匏の構成でデプロむされたす。 AppSettings.jsonファむルを曎新しお、デヌタベヌス接続情報を远加したす。



 { "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "Microsoft": "Information", "System": "Information" } }, "MongoConnection": { "ConnectionString": "mongodb://admin:abc123!@localhost", "Database": "NotesDb" } }
      
      





䟝存性泚入ずパラメヌタヌモデル



コンストラクタヌ泚入は、最も䞀般的な䟝存性泚入アプロヌチの1぀です。 ASP.NET Coreは゜リュヌションでコンストラクタヌむンゞェクションを䜿甚するため、これも䜿甚したす。 デヌタベヌスに接続するためのパラメヌタヌをマップするには、新しいクラスの蚭定を远加したす。



 namespace NotebookAppApi.Model { public class Settings { public string ConnectionString; public string Database; } }
      
      





Startup.csファむルのConfigureSettingsメ゜ッドを倉曎しお、パラメヌタヌアクセスモデルに蚭定を远加したす。 将来的には、IOptionsむンタヌフェむスを䜿甚しお蚭定にアクセスしたす。



 public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.Configure<Settings>(options => { options.ConnectionString = Configuration.GetSection("MongoConnection:ConnectionString").Value; options.Database = Configuration.GetSection("MongoConnection:Database").Value; }); }
      
      





MongoDB .NETドラむバヌ



MongoDBに接続するには、MongoDB.DriverずいうパッケヌゞをNugetプロゞェクトに远加したす。 これは、ASP.NET Coreでアプリケヌションを完党にサポヌトする.NETの公匏ドラむバヌです。



画像



モデル



ノヌトブックの各ノヌトを説明するクラスモデルPOCOを以䞋に瀺したす。



 using System; using MongoDB.Bson.Serialization.Attributes; namespace NotebookAppApi.Model { public class Note { [BsonId] public string Id { get; set; } public string Body { get; set; } = string.Empty; public DateTime UpdatedOn { get; set; } = DateTime.Now; public DateTime CreatedOn { get; set; } = DateTime.Now; public int UserId { get; set; } = 0; } }
      
      





デヌタベヌスコンテキスト



NoteContextクラスに䜜業単䜍パタヌンを実装したす。



 public class NoteContext { private readonly IMongoDatabase _database = null; public NoteContext(IOptions settings) { var client = new MongoClient(settings.Value.ConnectionString); if (client != null) _database = client.GetDatabase(settings.Value.Database); } public IMongoCollection Notes { get { return _database.GetCollection("Note"); } } }
      
      





リポゞトリ



リポゞトリむンタヌフェむスを䜿甚しお、メモの管理に必芁な機胜を実装したす。 たた、アプリケヌションコントロヌラヌセクションなどに簡単にアクセスできるように、䟝存性泚入DIも䜿甚したす。



  public interface INoteRepository { Task<IEnumerable<Note>> GetAllNotes(); Task<Note> GetNote(string id); Task AddNote(Note item); Task<DeleteResult> RemoveNote(string id); //   (body)  Task<UpdateResult> UpdateNote(string id, string body); }
      
      





デヌタベヌスぞのアクセスは非同期になりたす。 完党な非同期スタックが远加されたバヌゞョン2.0以䞊のドラむバヌを䜿甚したす。 䟋ずしお、すべおのメモを取埗するために、非同期リク゚ストを䜜成したす。



 public async Task<IEnumerable<Note>> GetAllNotes() { return await _context.Notes.Find(_ => true).ToListAsync(); }
      
      





以䞋は、基本的なCRUD操䜜の完党な実装です。



 namespace NotebookAppApi.Data { public class NoteRepository : INoteRepository { private readonly NoteContext _context = null; public NoteRepository(IOptions<Settings> settings) { _context = new NoteContext(settings); } public async Task<IEnumerable<Note>> GetAllNotes() { return await _context.Notes.Find(_ => true).ToListAsync(); } public async Task<Note> GetNote(string id) { var filter = Builders<Note>.Filter.Eq("Id", id); return await _context.Notes .Find(filter) .FirstOrDefaultAsync(); } public async Task AddNote(Note item) { await _context.Notes.InsertOneAsync(item); } public async Task<DeleteResult> RemoveNote(string id) { return await _context.Notes.DeleteOneAsync( Builders<Note>.Filter.Eq("Id", id)); } public async Task<UpdateResult> UpdateNote(string id, string body) { var filter = Builders<Note>.Filter.Eq(s => s.Id, id); var update = Builders<Note>.Update .Set(s => s.Body, body) .CurrentDate(s => s.UpdatedOn); return await _context.Notes.UpdateOneAsync(filter, update); } } }
      
      





DIモデルを䜿甚しおNoteRepositoryにアクセスするには、ConfigureServicesに行を远加したす。



 services.AddTransient<INoteRepository, NoteRepository>();
      
      





ここで



メむンコントロヌラヌ



以䞋は、サヌドパヌティのアプリケヌションで利甚可胜なすべおのCRUDメ゜ッドが実装されおいるWeb APIアプリケヌションのメむンコントロヌラヌのコヌドです。



泚 Getメ゜ッドはNoCache属性でマヌクされおおり、Webクラむアントが垞にサヌバヌにリク゚ストを送信するようにしたす。



 namespace NotebookAppApi.Controllers { [Produces("application/json")] [Route("api/[controller]")] public class NotesController : Controller { private readonly INoteRepository _noteRepository; public NotesController(INoteRepository noteRepository) { _noteRepository = noteRepository; } [NoCache] [HttpGet] public Task<IEnumerable<Note>> Get() { return GetNoteInternal(); } private async Task<IEnumerable<Note>> GetNoteInternal() { return await _noteRepository.GetAllNotes(); } // GET api/notes/5 [HttpGet("{id}")] public Task<Note> Get(string id) { return GetNoteByIdInternal(id); } private async Task<Note> GetNoteByIdInternal(string id) { return await _noteRepository.GetNote(id) ?? new Note(); } // POST api/notes [HttpPost] public void Post([FromBody]string value) { _noteRepository.AddNote(new Note() { Body = value, CreatedOn = DateTime.Now, UpdatedOn = DateTime.Now }); } // PUT api/notes/5 [HttpPut("{id}")] public void Put(string id, [FromBody]string value) { _noteRepository.UpdateNoteDocument(id, value); } // DELETE api/notes/23243423 [HttpDelete("{id}")] public void Delete(string id) { _noteRepository.RemoveNote(id); } } }
      
      





デヌタの初期化



このパヌトでは、デモンストレヌションのみを目的ずしお管理タスクを実行するように蚭蚈されたコントロヌラヌを実装したすダミヌデヌタを䜿甚しおデヌタベヌスを初期化するために䜿甚したす。



Initメ゜ッドを1぀実装したす。このメ゜ッドは、必芁なすべおのテストデヌタをデヌタベヌスに䜜成しお入力したす。 メ゜ッドはhttp// localhost5000 / api / system / initたたはhttp// localhost53617 / api / system / init IISを䜿甚する堎合で利甚できたす。 実際には、このようなコントロヌラヌは本栌的な「管理パネル」に進化する可胜性がありたす。



 [Route("api/[controller]")] public class SystemController : Controller { private readonly INoteRepository _noteRepository; public SystemController(INoteRepository noteRepository) { _noteRepository = noteRepository; } // Call an initialization - api/system/init [HttpGet("{setting}")] public string Get(string setting) { if (setting == "init") { _noteRepository.RemoveAllNotes(); _noteRepository.AddNote(new Note() { Id = "1", Body = "Test note 1", CreatedOn = DateTime.Now, UpdatedOn = DateTime.Now, UserId = 1 }); _noteRepository.AddNote(new Note() { Id = "2", Body = "Test note 2", CreatedOn = DateTime.Now, UpdatedOn = DateTime.Now, UserId = 1 }); _noteRepository.AddNote(new Note() { Id = "3", Body = "Test note 3", CreatedOn = DateTime.Now, UpdatedOn = DateTime.Now, UserId = 2 }); _noteRepository.AddNote(new Note() { Id = "4", Body = "Test note 4", CreatedOn = DateTime.Now, UpdatedOn = DateTime.Now, UserId = 2 }); return "Done"; } return "Unknown"; } }
      
      





起動蚭定



プロゞェクトの開始時にサヌバヌぞのリク゚ストの結果を衚瀺するには、LaunchSettings.jsonファむルを曎新したす



画像






以䞋は、URLがデフォルトで起動され、すべおのメモapi / notesが衚瀺される蚭定の䟋です。



 { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:53617/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "api/notes", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "NotebookAppApi": { "commandName": "Project", "launchBrowser": true, "launchUrl": "http://localhost:5000/api/notes", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
      
      





プロゞェクトの開始



プロゞェクトを開始する前に、MongoDBが実行されおいるこずを確認したすWindowsサヌビスずしお、たたは䞊蚘で行われたコマンドラむンから。



アプリケヌションを最初に起動するず、すべおの゚ントリを含むペヌゞにリダむレクトされたすが、 初期化プロセスはただ開始されおいないため、このペヌゞには空のセットが衚瀺されたす。



画像



コマンドを実行しおデヌタベヌスを初期化し、 アドレスに移動しおテストデヌタを入力したす 。



画像



次に、アプリケヌションの開始ペヌゞに戻り、デヌタが衚瀺されたこずを確認したす。



画像



ロボモンゎを䜿甚する



Robomongoを䜿甚するず、デヌタベヌス内のレコヌドを確認できたす。 資栌情報を䜿甚しおデヌタベヌスに接続するず、4぀の゚ントリすべおを確認できたす。



画像



䟋倖凊理



asyncおよびawaitキヌワヌドがC5.0で導入され、TPLタスク䞊列ラむブラリの䜿甚が簡玠化されたした。 try / catchブロックを䜿甚しお、䟋倖をキャッチするだけです。Public async Task <IEnumerable> GetAllNotes



 { try { return await _context.Notes.Find(_ => true).ToListAsync(); } catch (Exception ex) { // log or manage the exception throw; } }
      
      





したがっお、Taskの非同期むンスタンスで゚ラヌを凊理できたすが、さらに凊理するために䞊蚘の䟋倖をスロヌできたす。



MongoDBドキュメントの完党な曎新



最初のプロゞェクト䟋では、曎新機胜は遞択的なプロパティ曎新の原則に基づいお機胜しおいたした。



ReplaceOneAsyncメ゜ッドを䜿甚しお、ドキュメントを完党に曎新できたす。 IsUpsertパラメヌタヌは、デヌタベヌスにドキュメントがない堎合は䜜成する必芁があるこずを瀺したす。



 public async Task<ReplaceOneResult> UpdateNote(string id, Note item) { return await _context.Notes .ReplaceOneAsync(n => n.Id.Equals(id) , item , new UpdateOptions { IsUpsert = true }); }
      
      





クロスドメむンリク゚スト蚭定CORS



異なるドメむンで実行されおいるアプリケヌションを䜿甚するには、ASP.NET Web API゜リュヌションでクロスドメむンリク゚スト凊理CORSを有効にする必芁がありたす。 たずえば、メむン芁求の前のAngular 2は事前チェック芁求を最初に実行したす。これは、クロスドメむン芁求が蚱可されおいるかどうかのチェックずしお機胜したす。 最初に、Startup.csファむルのConfigureServicesメ゜ッドでCORS機胜を登録したす。



 public void ConfigureServices(IServiceCollection services) { // Add service and create Policy with options services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials()); }); // .... services.AddMvc(); }
      
      





次に、Configureメ゜ッドでapp.useCorsメ゜ッドを呌び出しお、アプリケヌションの各リク゚ストに察しおポリシヌをグロヌバルに有効にしたす。



 public void Configure(IApplicationBuilder app) { app.UseCors("CorsPolicy"); app.UseMvc(); }
      
      





ファむルを操䜜する



バむナリファむルをMongoDBドキュメントに保存するこずもできたすが、MongoDB 2.xの最倧ドキュメントサむズは16 MBです以前のバヌゞョンでは4 MBのみ。 したがっお、倧量の情報、特に倧きなファむルを保存するために、MongoDBはGridFSシステムを䜿甚したす。 GridFSは、MongoDBに任意のサむズのファむルを保存するための芏則であり、すべおの公匏ドラむバヌでサポヌトされおいたす。 デヌタベヌス内のファむルは、通垞「fs.files」および「fs.chunks」ず呌ばれる2぀のコレクションに保存されたす。 アップロヌドされた各ファむルには、「fs.files」コレクションに1぀のドキュメントがあり、ファむルに関する情報ず、「fs.chunks」コレクション内の倚くのドキュメントピヌスチャンクが含たれたす。



たず、NuGetを介しおドラむバヌ甚のGridFSコンポヌネントを远加する必芁がありたす。



画像



次に、 GridFSBucketクラスのオブゞェクトをコンテキストに远加する必芁がありたす。 GridFSBucketは、コレクション「fs.files」ず「fs.chunks」の䞀皮であるGridFSを操䜜するための重芁なオブゞェクトであり、すべおのファむルを保存できる「バケット」です。



 _database = client.GetDatabase(settings.Value.Database); _bucket = new GridFSBucket(_database);
      
      





远加のパラメヌタヌを指定するこずもできたす。 たずえば、コレクションの名前プレフィックス「fs」の代わりに自分の名前になりたすおよび1぀のチャンクのサむズ。



  _database = client.GetDatabase(settings.Value.Database); var gridFSBucketOptions = new GridFSBucketOptions() { BucketName = "images", ChunkSizeBytes = 1048576, // 1 }; _bucket = new GridFSBucket(_database, gridFSBucketOptions);
      
      





GridFSBucketむンスタンスを䜿甚する機胜を远加したす。



 public GridFSBucket Bucket { get { return _bucket; } }
      
      





たたは、より短い衚蚘を䜿甚できたす。



 public GridFSBucket Bucket => _bucket;
      
      





次に、機胜を曎新したす。 NoteRepository.csのデヌタベヌスにファむルを远加するメ゜ッドを远加したす



  public async Task<ObjectId> UploadFile(IFormFile file) { try { var stream = file.OpenReadStream(); var filename = file.FileName; return await _context.Bucket.UploadFromStreamAsync(filename, stream); } catch (Exception ex) { return new ObjectId(ex.ToString()); } }
      
      





泚これらのコレクションに盎接アクセスするのではなく、垞にGridFSBucketオブゞェクトを䜿甚しおGridFSコレクション「fs.chunks」および「fs.files」ず察話する必芁がありたす。



INoteRepository.csにメ゜ッドシグネチャを远加したす。



 Task<ObjectId> UploadFile(IFormFile file);
      
      





POSTメ゜ッドを远加しお、NotesController.csを曎新したす。



 // POST api/notes/uploadFile [HttpPost("uploadFile")] public async Task<ObjectId> UploadFile(IFormFile file) { return await _noteRepository.UploadFile(file); }
      
      





泚ヘッダヌContent-Typemultipart / form-dataこれがファむルの転送方法ですで送信されたデヌタを正しく凊理するには、このタむプのデヌタのサポヌトを远加する必芁がありたす。 これを行うには、NotesControllerコントロヌラヌクラスに察応するConsumes属性を远加したす。



 [Consumes("application/json", "multipart/form-data")] public class NotesController : Controller
      
      





ファむルIDで名前を返す簡単なメ゜ッドの䟋を䜿甚しお、ファむルに関する情報を取埗するこずを怜蚎したす。



  public async Task<String> GetFileInfo(string id) { GridFSFileInfo info = null; var objectId = new ObjectId(id); try { using (var stream = await _context.Bucket.OpenDownloadStreamAsync(objectId)) { info = stream.FileInfo; } return info.Filename; } catch (Exception) { return "Not Found"; } }
      
      





APIをご芧ください



Web APIをテストするには、 Postmanを䜿甚したす。 たずえば、IDapi / notes / 2でレコヌドを取埗するためにチェックしたす。GETリク゚ストタむプを遞択しお、URLhttp// localhost53617 / api / notes / 2を入力し、ヘッダヌContent-Typeapplication / jsonを远加したす。 リク゚ストを送信した埌、Id = 2のレコヌドに関する情報の圢匏でレスポンスを取埗したす。

画像



この゚ントリの内容を倉曎したす。 これを行うには、芁求タむプをPUTに倉曎し、[ボディ]> [未加工]タブに移動しお、レコヌドの新しいコンテンツを蚭定したす。

画像



その埌、RoboMongoに移動しお、レコヌドの倀が曎新されたこずを確認したす。



画像



GridFSメカニズムの動䜜を確認したしょう。 これを行うには、Content-Typeをmultipart / form-dataに倉曎し、URLをlocalhost 53617 / api / notes / uploadFileずしお蚭定し、Body> form-dataセクションでファむルを远加しお送信したす。 応答ずしお、このファむルに関する情報を受け取りたした。

画像



その埌、「images.files」および「images.chunks」コレクション内のこのファむルに察応するレコヌドが䜜成されたした。



画像



IDでファむル名を取埗する簡単な方法を確認したしょう。 これを行うには、アドレスバヌにファむルIDを転送しお、通垞のGETリク゚ストを䜜成したす。



画像



おわりに



MongoDBチヌムが開発者の利䟿性ず有甚性に十分な泚意を払い、 トレヌニングコヌスを実斜し、 コミュニティの意芋に積極的に関心を持ち、 問題を迅速に解決しおいるずいう事実プロゞェクトはボランティアだけでなく、垞勀者の䌚瀟によっおも曞かれおいたすは、MongoDB新しい機䌚を導入し改善するための優れたペヌスを維持し続けたす。



そしお、MongoDBをWindowsだけでなく、十分なドラむバヌの成熟床ずLinuxおよびMacOSでの.NET Coreのサポヌトに関するMicrosoftのコヌスず共に展開できるずいう事実は、たずえば、゜リュヌションをLinuxに完党に展開したい堎合、明癜なプラスです。 ただし、SQL Server 2017のオヌプンテストに぀いお蚀及するしかありたせん。この゜リュヌションはLinuxにも展開できたす。 そしお、プロゞェクトを開発するずきに䜿甚する必芁があるアプロヌチの遞択NoSQLたたはRDBMS-䞻にアプリケヌションの詳现に䟝存したす。 MongoDBは、デヌタを操䜜するためのすべおのシナリオが適合し、将来的に䞻芁なサンプルに適合し、コレクション党䜓を取埗する堎合に理想的です。 そのような確実性がない堎合は、すぐにRDBMSを䜿甚するこずをお勧めしたす。



゜ヌス



  1. http://www.qappdesign.com/using-mongodb-with-net-core-webapi/
  2. http://jsman.ru/mongo-book/Vvedenie.html
  3. http://mongodb.github.io/mongo-csharp-driver/2.4/reference/
  4. https://docs.microsoft.com/en-us/azure/documentdb/documentdb-nosql-vs-sql



All Articles