MongoDBを始める前に知っおおきたい14のこず

蚘事の翻蚳は、コヌス「非リレヌショナルデヌタベヌス」の開始前倜に䜜成されたした。










ハむラむト



  • MongoDBではオプションですが、スキヌマを蚭蚈するこずは非垞に重芁です。
  • 同様に、むンデックスはスキヌマずアクセスパタヌンに䞀臎する必芁がありたす。
  • 倧きなオブゞェクトや倧きな配列の䜿甚は避けおください。
  • 特にセキュリティず信頌性に関しおは、MongoDBの蚭定に泚意しおください。
  • MongoDBにはク゚リオプティマむザがないため、ク゚リ操䜜を実行するずきは泚意が必芁です。


私は非垞に長い間デヌタベヌスを扱っおきたしたが、MongoDBを発芋したのは぀い最近のこずです。始める前に知りたいこずがいく぀かありたす。人がすでに特定の分野での経隓を持っおいるずき、圌らはデヌタベヌスずは䜕か、そしお圌らが䜕をしおいるのかに぀いお先入芳を持っおいたす。他の人が理解しやすいように、よくある間違いのリストを以䞋に瀺したす。



認蚌なしでMongoDBサヌバヌを䜜成する



残念ながら、MongoDBはデフォルトで認蚌なしでむンストヌルされたす。ワヌクステヌションがロヌカルでアクセスされるのは正垞です。ただし、MongoDBは倧量のメモリを䜿甚するのが倧奜きなマルチナヌザヌシステムであるため、開発にのみ䜿甚する堎合でも、できるだけ倚くのRAMを備えたサヌバヌに配眮するこずをお勧めしたす。デフォルトのポヌトを介しおサヌバヌにむンストヌルするず、特にリク゚ストでjavascriptコヌドを実行できる堎合たずえば、むンゞェクションの$whereアむデアずしお、問題が発生する可胜性がありたす。



認蚌方法はいく぀かありたすが、最も簡単なのはナヌザヌID /パスワヌドを蚭定するこずです。掟手なLDAPベヌスの認蚌に぀いお考えるずきは、この考えを取り入れおください。セキュリティの芳点から、MongoDBを最新の状態に保ち、䞍正アクセスがないかログを垞にチェックする必芁がありたす。たずえば、デフォルトのポヌトずしお別のポヌトを遞択したいず思いたす。



攻撃面をMongoDBにバむンドするこずを忘れないでください



MongoDBセキュリティチェックリストには、ネットワヌクぞの䟵入やデヌタ挏掩のリスクを軜枛するための優れたヒントが含たれおいたす。それを华䞋しお、開発サヌバヌは高レベルのセキュリティを必芁ずしないず蚀うのは簡単です。ただし、状況はそれほど単玔ではなく、これはすべおのMongoDBサヌバヌに圓おはたりたす。具䜓的には、説埗力のない限り、䜿甚するこずに理由があるmapReduce、groupたたは$あなたが蚭定ファむルに曞き蟌むこずにより、任意のJavaScriptコヌドの䜿甚を無効にする必芁がありたすが、javascriptEnabled:false。デヌタファむルは暙準のMongoDBで暗号化されおいないため、完党なファむルアクセス暩を持ち、アクセスが制限され、オペレヌティングシステム独自のファむルアクセスコントロヌルを䜿甚できる専甚ナヌザヌでMongoDBを実行するこずは理にかなっおいたす。



回路蚭蚈゚ラヌ



MongoDBはスキヌマを䜿甚したせん。しかし、これは回路が必芁ないずいう意味ではありたせん。䞀貫性のあるレむアりトなしでドキュメントを保存したいだけの堎合、保存はすばやく簡単にできたすが、埌で取埗するのは非垞に困難です。



叀兞的な蚘事「MongoDBのスキヌマ蚭蚈のための芪指の6぀のルヌルは」のような機胜ながら、読む䟡倀スキヌマ゚クスプロヌラメヌカヌ3Tのサヌドパヌティ補のツヌルでは、通垞のスキヌマ怜蚌のために䜿甚しお䟡倀がありたす。



䞊べ替え順序を忘れないでください



䞊べ替え順序を忘れるず、他の蚭定ミスの䞭で最もむラむラし、無駄になる可胜性がありたす。 MongoBDは、デフォルトでバむナリ゜ヌトを䜿甚したす。しかし、それが誰にずっおも圹立぀ずは思えたせん。 1980幎代には、ケヌスセンシティブ、ストレスセンシティブ、バむナリ゜ヌトは、ビヌズ、カフタン、巻き毛の口ひげずずもに、奇劙な異時性ず芋なされおいたした。今ではそれらの䜿甚は蚱されたせん。実生掻では「モヌタヌサむクル」は「モヌタヌサむクル」ず同じです。そしお、「ブリテン」ず「ブリテン」は同じ堎所です。小文字は単に倧文字に盞圓する倧文字です。そしお、私にdiacriticalsortingに぀いお話させないでください。 MongoDBでデヌタベヌスを䜜成するずきは、倧文字ず小文字を区別しない照合を䜿甚しおくださいシステムのナヌザヌの蚀語ず文化に察応するもの。これにより、文字列デヌタの怜玢が倧幅に簡玠化されたす。



倧きなドキュメントでコレクションを䜜成する



MongoDBは、最倧16MBのサむズの倧きなドキュメントをコレクションでホストできたす。GridFSは、16MBを超える倧きなドキュメント甚に蚭蚈されおいたす。しかし、倧きなドキュメントをそこに配眮できるずいう理由だけで、それらをそこに保持するこずはお勧めできたせん。MongoDBは、個々のドキュメントを数キロバむトのサむズで保存し、幅の広いSQLテヌブルの行のように扱う堎合に最適に機胜したす。倧きなドキュメントはパフォヌマンスの問題の原因になりたす。



倧きな配列でドキュメントを䜜成する



ドキュメントには配列を含めるこずができたす。配列内の芁玠の数が4桁の数から離れおいる堎合に最適です。芁玠が配列に頻繁に远加されるず、それを含むドキュメントよりも倧きくなり、移動する必芁がありたす。぀たり、むンデックスを曎新する必芁がありたす。倧きな配列を䜿甚しおドキュメントのむンデックスを再䜜成するず、芁玠ごずにむンデックスを栌玍する゚ントリがあるため、むンデックスが䞊曞きされるこずがよくありたす。このむンデックスの再䜜成は、ドキュメントが挿入たたは削陀されたずきにも発生したす。



MongoDBには、この問題を最小限に抑えるためにドキュメントを拡匵するためのスペヌスを提䟛する、いわゆる「フィルファクタヌ」がありたす。

配列にむンデックスを付けなくおもできるず思うかもしれたせん。残念ながら、むンデックスがないため、他の問題が発生する可胜性がありたす。ドキュメントは最初から最埌たでスキャンされるため、配列の最埌にある芁玠を芋぀けるのに時間がかかり、そのようなドキュメントに関連するほずんどの操䜜は遅くなりたす。



集蚈事項の段階の順序を忘れないでください



ク゚リオプティマむザデヌタベヌスシステムでは、䜜成するク゚リは取埗したいものの説明であり、取埗方法ではありたせん。このメカニズムは、レストランでの泚文ず同様に機胜したす。通垞、料理を泚文するだけで、シェフに詳现な指瀺を䞎えるこずはありたせん。



MongoDBでは、料理人に指瀺したす。たずえば、デヌタが通過するこずを確認する必芁がありたすreduce䜿甚しおパむプラむンで可胜な限り早期に$matchず$project、゜ヌト埌にのみ発生しreduce、そしおそれは、怜玢は、あなたがそれを必芁ずする正確に順番に起こりたす。䞍芁な䜜業を排陀し、ステヌゞを最適に線成し、接続のタむプを遞択するク゚リオプティマむザがあるず、台無しになる可胜性がありたす。 MongoDBでは、利䟿性を犠牲にしおより詳现に制埡できたす。



のようなツヌルStudio 3Tを䜿甚するず、MongoDBで集蚈ク゚リを簡単に䜜成できたす。Aggregation Editorを䜿甚するず、パむプラむンステヌトメントを䞀床に1ステップず぀適甚できるだけでなく、各ステップで入力デヌタず出力デヌタを怜蚌しお、デバッグを簡玠化できたす。



クむックレコヌディングの䜿甚



MongoDB曞き蟌みパラメヌタを高速で信頌性の䜎いものに蚭定しないでください。この「ファむルアンドフォヌゲット」モヌドは、曞き蟌みが行われる前にコマンドが戻るため、高速に芋えたす。デヌタがディスクに曞き蟌たれる前にシステムがクラッシュするず、デヌタは倱われ、䞀貫性のない状態になりたす。幞い、64ビットのMongoDBではロギングが有効になっおいたす。



ストレヌゞ゚ンゞンMMAPv1ずWiredTigerはこれを防ぐためにロギングを䜿甚したすが、ロギングが無効になっおいる堎合、WiredTigerは最埌に䞀臎したチェックポむントに回埩できたす。



ゞャヌナル凊理により、デヌタベヌスはリカバリ埌に䞀貫した状態になり、ゞャヌナルに曞き蟌たれるたですべおのデヌタが保持されたす。゚ントリの頻床は、パラメヌタを䜿甚しお蚭定されたすcommitIntervalMs。



レコヌドを確認するには、構成ファむルでロギングが有効になっおいる(storage.journal.enabled)こず、およびレコヌドの頻床が、倱う可胜性のある情報の量に察しお適切であるこずを確認しおください。



むンデックスなしの䞊べ替え



怜玢および集蚈する堎合、倚くの堎合、デヌタを䞊べ替える必芁がありたす。うたくいけば、これは、゜ヌトされるデヌタの量を枛らすために結果をフィルタリングした埌、最終段階の1぀で行われたす。それでも、䞊べ替えるにはむンデックスが必芁です。単䞀たたは耇数のむンデックスを䜿甚できたす。



適切なむンデックスがない堎合、MongoDBはそれなしで実行したす。䞊べ替え操䜜のすべおのドキュメントの合蚈サむズには32MBのメモリ制限があり、MongoDBがこの制限に達するず、゚ラヌがスロヌされるか、空のレコヌドセットが返されたす。



むンデックスをサポヌトせずに怜玢



怜玢ク゚リは、SQLのJOIN操䜜ず同様の機胜を実行したす。最高のパフォヌマンスを埗るには、倖郚キヌずしお䜿甚されるキヌ倀のむンデックスが必芁です。䜿甚法はに反映されおいないため、これは明らかではありたせんexplain()。このようなむンデックスは、むンデックスに曞かれたこずに加えおいるexplain()順番にパむプラむン挔算子によっお䜿甚され、$matchそしお$sort、圌らは、パむプラむンの先頭で発生した堎合、。むンデックスは、集玄パむプラむンの任意の段階をカバヌできるようになりたした。



マルチアップデヌトの䜿甚をオプトアりトする



このメ゜ッドはdb.collection.update()、指定したパラメヌタヌに応じお、既存のドキュメントの䞀郚たたはドキュメント党䜓を完党に眮き換えるたで倉曎するために䜿甚されたすupdate。multiク゚リ条件を満たすすべおのドキュメントを曎新するオプションを蚭定するたで、コレクション内のすべおのドキュメントが凊理されないこずはそれほど明癜ではありたせん。



ハッシュテヌブル内のキヌの順序の重芁性を忘れないでください



JSONでは、オブゞェクトは0個以䞊の名前ず倀のペアの順序付けられおいないコレクションで構成されたす。ここで、nameは文字列、valueは文字列、数倀、ブヌル倀、れロ、オブゞェクト、たたは配列です。



残念ながら、BSONは怜玢時に順序を非垞に重芁芖しおいたす。MongoDBでは、むンラむンオブゞェクト内のキヌの順序が重芁です。{ firstname: "Phil", surname: "factor" }ず同じではありたせん{ { surname: "factor", firstname: "Phil" }。぀たり、確実に芋぀けたい堎合は、ドキュメント内の名前ず倀のペアの順序を維持する必芁がありたす。



「null」ず「undefined」を混同しないでください



倀「undefined」は、JavaScriptで䜿甚されおいる堎合でも、公匏のJSON暙準ECMA-404、セクション5に埓っおJSONで有効になるこずはありたせんでした。さらに、BSONの堎合、これは非掚奚になり、に倉換されたす$null。これは必ずしも適切な゜リュヌションではありたせん。MongoDBで「未定矩」を䜿甚するこずは避けおください。



$limit()なしで䜿甚$sort()



倚くの堎合、MongoDBで開発しおいるずきは、ク゚リたたは集蚈から返される結果のサンプルを確認するず䟿利です。これはこのタスク$limit()に圹立ちたすが、コヌドの前で䜿甚しない限り、コヌドの最終バヌゞョンに含めるこずはできたせん$sort。このメカニズムが必芁なのは、そうしないず結果の順序を保蚌できず、デヌタを確実に衚瀺できないためです。結果の䞊郚に、䞊べ替えに応じお異なるレコヌドが衚瀺されたす。確実に機胜するには、ク゚リず集蚈が決定論的である必芁がありたす。぀たり、実行されるたびに同じ結果が生成されたす。$limit()存圚するが存圚しないコヌドは$sort決定論的ではなく、その埌、远跡が困難な゚ラヌを匕き起こす可胜性がありたす。



結論



MongoDBに䞍満を感じる唯䞀の方法は、MongoDBをDBMSなどの別のタむプのデヌタベヌスず盎接比范するか、MongoDBを䜿甚するずいう特定の期埅を抱くこずです。オレンゞずフォヌクを比范するようなものです。デヌタベヌスシステムには特定の目暙がありたす。これらの違いを自分で理解しお理解するのが最善です。 MongoDB開発者にDBMSパスをたどらざるを埗ないパスがあるため、圧力をかけるのは残念です。デヌタの敎合性を確保したり、悪意のあるナヌザヌによる障害や攻撃に匷いデヌタシステムを構築したりするなど、叀い問題を解決するための新しくお゚キサむティングな方法を芋たいず思っおいたす。



MongoDBのACIDトランザクション性の4.0実装は、重芁な改善がいかに革新されおいるかを瀺す良い䟋です。マルチドキュメントおよびマルチステヌトメントトランザクションはアトミックになりたした。たた、ロックの取埗やハングしたトランザクションの完了にかかる時間を調敎したり、分離レベルを倉曎したりするこずも可胜になりたした。





続きを読む






All Articles