web-dev-qa-db-ja.com

mongoose vs mongodb(nodejsモジュール/拡張)、どちらが良いですか?なぜ?

Node.jsにたどり着いたところ、MongoDBで使用できるライブラリがたくさんあることがわかりました。最も人気のあるものは、これら2つ(mongooseとmongodb)のようです。これらの拡張機能の長所と短所を取得できますか?これら2つのより良い代替手段はありますか?

編集:node-mongolianとも興味深いと思われる新しいライブラリを見つけました。「Mongolian DeadBeefは、mongodb Shellを厳密に近似しようとする素晴らしいMongo DB node.jsドライバーです」。 (readme.md)

https://github.com/marcello3d/node-mongolian

これは、これを見る新しい人々により多くのリソースを追加するためです。したがって、基本的にモンゴル語はODMのようなものです...

106
norman784

Mongooseはより高いレベルであり、MongoDBドライバーを使用します(依存関係であるため、package.jsonを確認してください)。そのため、これらのオプションを指定すると、どちらの方法でも使用できます。自問すべき質問は、「生のドライバを使用したいのですか、それともオブジェクトドキュメントモデリングツールが必要ですか?」です。いくつかの低レベルの作業をスキップするオブジェクトモデリング(SQLのORMに相当するODM)ツールを探しているなら、Mongooseが必要です。

ドライバーが必要な場合は、ODMが実施する可能性のある多くの規則を破るつもりなので、MongoDBを使用します。高速ドライバーが必要で、いくつかの欠落している機能を使用できる場合は、Mongolian DeadBeefを試してください。 https://github.com/marcello3d/node-mongolian

121
cjohn

マングースは、群を抜いて最も人気があります。私はそれを使用し、他の人は使用していません。だから私は他の人について話すことはできませんが、私はあなたにマングースとの不満を伝えることができます。

  • 難しい/不十分なドキュメント
  • モデル が使用されます。また、ドキュメントの構造を定義します。しかし、これはMongoにとっては奇妙に思えますが、その利点の1つは、列(err、attribute?)を挿入できること、または単に追加できないことです。
  • モデルは大文字と小文字を区別します-私自身と一緒に作業する他の開発者は、モデルが定義されているコレクション名の大文字と小文字がエラーなしで何も保存しないという問題を抱えていました。すべて小文字の名前を使用するのが最適であることがわかりました。例えば。 mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })のようなことをする代わりに、(コレクション名が実際にMyCollectionであっても)行う方が良いです:mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

しかし、正直なところ、それは本当に便利です。最大の問題はドキュメントです。そこにありますが、乾燥していて、必要なものを見つけるのは難しいです。より良い説明とより多くの例を使用できます。しかし、これらのことをすり抜けると、本当にうまく機能します。

33
Marshall

私は新しいアプリを構築し、現在その構造を設計しています。ここでは、mongooseを使用する理由と使用しない理由について考えます。

  1. Mongooseは遅くなります(大きなアプリの場合)
  2. Mongooseはより複雑なクエリでは難しい
  3. もっと高速にしたい場合は、mongooseを使用しないことを選択すると、mongooseを使用してクエリを半分、w/oを使用しないクエリを実行できます。それはおかしな状況で、かつてありました。
  4. Mongooseは、シンプルなdb構造を持つシンプルなアプリでコードを高速化します
  5. Mongooseは、mongodbドキュメントとmongooseドキュメントを読むようにします
  6. Mongooseを使用すると、スタックに依存するものが1つ増え、クラッシュして灰に焼ける可能性がもう1つあります。

mongodbドライバーはrawドライバーです。mongodbと直接通信します。マングースは抽象化レイヤーです。 dbの構造が十分にシンプルでありながら、dbへのI/Oが簡単になります。

抽象化はその要件をもたらし、それらに従う必要があります。アプリは遅くなり、より多くRAMを食べ、より複雑になりますが、使用方法を知っていれば、単純なオブジェクトをより速く記述し、データベースに保存できます。

Mongooseを使用しないと、mongodbに直接接続してアプリケーションを高速化できます。データベースにデータを保存するための独自のモデルを書くことはできないと言う人はいません。あなたはできる。そして、もっと簡単だと思います。使用するコードを作成し、必要なものを知っています。抽象化レイヤーは、マングースのレイヤーよりもずっと小さくなります。

私はPHP worldから来ました、そこには減価償却されたmysql_関数を持つ生のSQLがあり、PDO-sqlと通信するためのオブジェクト指向の抽象化レイヤーがあります。または、=のような重いORMを選択できますDoctrine mongoDBのmongooseに似たものを用意します。setter/ getters/saveメソッドなどのオブジェクト。これは問題ありませんが、抽象化を追加することで、ファイル、ロジック、ドキュメント、依存関係を増やします。スタックを単純にし、依存関係を少なくしたいのですが、そういうわけで、PHPからサーバー/クライアントJavascriptに移動しました。

Mongooseでは、いくつかのsqlに似た単純なdb構造を持つ単純なアプリを記述するのは素晴らしいと思います。サブドキュメントの作成を開始し、これらのクレイジーなクエリをすべて作成する場合、mongooseでは非常に難しいことがわかりました。 mongodbのドキュメントを見てから、mongooseのドキュメントを見て、必要なクエリを作成する方法を見つける必要があります。時々、mongodbのX futureはマングースではないことがわかるので、生のmongodbドライバーに行き、生のmongodbクエリを1か所で記述します。 mongooseがなければ、mongodb docsを見てクエリを実行します。

24
Lukas

Mongodbのみを使用しました。私個人の意見では、何か低いレベルから始めてから上に進むことをお勧めします。そうしないと、mongooseのような高レベルのドライバーが提供する追加の高度な機能を使用しても、実際の利益が得られない場合があります。

Node.jsの風土病であるmongodbで私が抱えていた問題は、不十分なドキュメントです。ドキュメントとその多くがありますが、常に最も役立つとは限りません。私がこれまで見てきたことは、ドライバーの本番使用の良い完全な例はありません。ドキュメントには、接続を開き、コマンドを発行して接続を閉じるという同じテンプレートの例が記載されています。すべての例には、各例に必要なものだけでなく、必要なものすべてに必要なものが含まれているため、テンプレートからコピーして貼り付けることができます。

完全にランダムに取られた例を与えるには:

  • raw {Boolean、default:false}、生のbsonバッファーを使用して操作を実行します。

「生のbsonバッファーを使用して操作を実行する」とは正確には何ですか私はそれがどこでも説明されているのを見つけることができず、そのフレーズのGoogle検索は助けになりません。おそらく、Googleをさらに進めることができますが、そうする必要はないはずです。情報はそこにあるはずです。このオプションを有効/無効にするためのパフォーマンス、安定性、整合性、互換性、移植性、または機能的な利点はありますか?コードを深く掘り下げなければ、私にはまったくわからない。あなたが私のボートに乗っているなら、それは深刻な問題だ。完全な永続性は必要ありませんが、実行時にプログラムが非常に安定している必要があるデーモンがあります。これは、JSONにデシリアライズおよびシリアライズすることを期待している、またはユーザーに対して内部的かつ透過的な低レベルの何かを期待しているが、間違っている可能性があることを意味します。私は良い仮定をする傾向がありますが、重要なシステムを作るとき、私は仮定と当て推量に頼ることができません。したがって、ここでコードを使用してアサーションをテストするか、Googleまたはそのコードをより深く掘り下げることができます。これはそれほど悪いことではありませんが、ドキュメントを読んでいると、この状況に何度も陥ります。違いは、タスクに費やされる日数と時間を意味する場合があります。確認が必要です。確認はもちろんのこと、ドキュメントにはほとんど説明がありません。

ドキュメントは急ぎます。イベントについては説明せず、エラーがスローされるタイミングやエラーの性質についてのあいまいな詳細を提供します。接続を実現する方法はいくつかありますが、それらは不明な場合があります。あなたはそれで完全に役に立たないことができますが、それは端の周りで非常に荒いです。推測と実験に委ねられることがいくつかあります。

13
jgmjgm