mongoose vs mongodb (nodejs modülleri / uzantıları), hangisi daha iyi? ve neden?


109

Node.js'ye yeni geldim ve MongoDB ile kullanılacak birçok kitaplık olduğunu gördüm, en popüler olanı şu ikisi: (firavun faresi ve mongodb). Bu uzantıların artılarını ve eksilerini öğrenebilir miyim? Bu ikisine daha iyi alternatifler var mı?

Düzenleme: Aynı zamanda ilginç düğüm moğolca görünen ve "Mongolian DeadBeef, mongodb kabuğuna yakından yaklaşmaya çalışan harika bir Mongo DB node.js sürücüsü." (Readme.md)

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

Bu sadece bunu gören yeni insanlara daha fazla kaynak eklemek içindir, yani temelde Moğolca bir ODM'ye benziyor ...


Şema daha az veritabanı için neden bir şema katmanı kullanılmalı? Şema tabanlı bir veritabanı istiyorsanız, onun için oluşturulmuş başka bir şey kullanın. (Firavun faresi sadece mongodb'un şema soyutlamasıdır)
Simon Dragsbæk

Yanıtlar:


123

Mongoose daha yüksek seviyededir ve MongoDB sürücüsünü kullanır (bu bir bağımlılıktır, package.json'u kontrol edin), bu nedenle bu seçenekler verildiğinde her iki şekilde de kullanacaksınız. Kendinize sormanız gereken soru, "Ham sürücüyü mü kullanmak istiyorum yoksa bir nesne-belge modelleme aracına mı ihtiyacım var?" Daha düşük seviyeli bir işi atlamak için bir nesne modelleme (ODM, SQL dünyasındaki ORM'lerin karşılığı) aracı arıyorsanız, Mongoose'u istersiniz.

Bir ODM'nin uygulayabileceği birçok kuralı çiğnemek istediğiniz için sürücü istiyorsanız, MongoDB ile gidin. Hızlı bir sürücü istiyorsanız ve bazı eksik özelliklerle yaşayabiliyorsanız, Mongolian DeadBeef'i deneyin: https://github.com/marcello3d/node-mongolian


34

Mongoose, açık ara en popüler olanıdır. Ben kullanıyorum ve başkalarını kullanmadım. Bu yüzden diğerleri hakkında konuşamam ama Mongoose ile yakınlığımı söyleyebilirim.

  • Zor / zayıf dokümantasyon
  • Modeller kullanılmaktadır. Ve belgelerinizin yapısını tanımlarlar. Yine de bu Mongo için tuhaf görünüyor, burada avantajlarından biri bir sütun (hata, öznitelik?) Atabilir ya da hiç eklemeyebilirsiniz.
  • Modeller büyük / küçük harfe duyarlıdır - Ben ve birlikte çalıştığım diğer geliştiriciler, modelin tanımlandığı koleksiyon adının büyük / küçük harf durumunun hiçbir hata olmadan hiçbir şey kaydetmemesine neden olabileceği sorunları yaşadı. Tüm küçük harflerin kullanılmasının en iyi sonucu verdiğini bulduk. Örneğin, yapması mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })daha iyi gibi bir şey yapmak yerine ( koleksiyon adı gerçekten olsa bile MyCollection):mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

Ama dürüst olmak gerekirse, gerçekten yararlı. En büyük sorun belgelerdir. Orada, ama kuru ve ihtiyacınız olanı bulmak zor. Daha iyi açıklamalar ve daha fazla örnek kullanabilirdi. Ama bunları bir kez aştığınızda gerçekten işe yarıyor.


11
Re: belgeler. Daha fazla katılamadım. Dokümantasyon kötü ve işleri daha da kötüleştiriyor, bazı yerlerde yanlış. Sık sık kendimi kodu kırarken buldum (ki bu o kadar da kötü bir şey değil), ancak dokümantasyon sorunları nedeniyle.
JP Richardson

1
AFAIK koleksiyon adları Mongoose'da değil, Mongo'da büyük / küçük harfe duyarlıdır.
Nick Campbell

34
Birinin merak etmesi durumunda, dokümantasyon şimdi oldukça iyi.
Kevin Beal

7
Kabul etmiyorum, Dokümantasyon hala geç.
Steve K

5
Belgelerin hala eksik olduğunu da kabul eder misiniz
Brendan Weinstein

25

Yeni bir uygulama geliştiriyorum ve şimdi onun yapısını tasarlıyorum, işte firavun faresini neden kullanıp kullanmama konusunda bazı düşünceler:

  1. Firavun faresi daha yavaş olacak (büyük uygulamalar için)
  2. Firavun faresi daha karmaşık sorgularla daha zordur
  3. Daha fazla hız istediğiniz ve firavun faresi olmadan gitmeyi seçeceğiniz durumlar olacak, o zaman firavun faresi ile yarı sorgularınız olacak ve yarısı w / o olacak. Bu çılgın bir durum, bir zamanlar ...
  4. Mongoose, basit db yapısına sahip basit uygulamalarla daha hızlı kod yazmanızı sağlar
  5. Firavun faresi size mongodb belgelerini ve firavun faresi belgelerini okutacak
  6. Firavun faresi ile yığınız güvenecek bir şeye daha sahip olacak ve bu, parçalanmak ve küllere yakmak için bir olasılık daha olacak.

mongodb sürücüsü ham sürücüdür, doğrudan mongodb ile iletişim kurarsınız. firavun faresi soyutlama katmanıdır. DB yapınız yeterince basitken db'ye daha kolay G / Ç elde edersiniz.

Soyutlama, gereksinimlerini beraberinde getirir ve bunlara uymanız gerekir. Uygulamanız daha yavaş olacak, daha fazla RAM tüketecek ve daha karmaşık hale gelecektir, ancak onu nasıl kullanacağınızı biliyorsanız, basit nesneleri daha hızlı yazabilir, bunları veritabanına kaydedebilirsiniz.

Firavun faresi olmadan, mongodb ile doğrudan bağlantı ile daha hızlı uygulamaya sahip olacaksınız. Öğeleri db'ye kaydetmek için kendi modellerinizi yazamayacağınızı kimse söylemiyor. Yapabilirsin. Ve bence daha kolay. Kullanacağınız kodu yazarsınız, neye ihtiyacınız olduğunu bilirsiniz. Siz soyutlama katmanınız çok daha küçük olacak, sonra firavun faresi olacak.

PHP dünyasından geliyorum, orada amortismana tabi mysql_ işlevlerine sahip ham sql'imiz vardı, sonra sql ile iletişim kurmak için PDO - nesne yönelimli soyutlama katmanı aldık. Veya mongoDB'de mongoose'a benzer şeyler elde etmek için Doctrine gibi bazı ağır ORM'leri seçebilirsiniz. Ayarlayıcı / alıcı / kaydetme yöntemine sahip nesneler vb. Sorun değil, ancak daha fazla soyutlama ekleyerek daha fazla dosya, daha fazla mantık, daha fazla belge, daha fazla bağımlılık ekliyorsunuz. İşleri basit tutmayı ve yığınımda daha az bağımlılık olmasını seviyorum. BTW, bu yüzden PHP'den sunucu-istemci Javascript'e ilk etapta geçtim ..

Mongoose ile, sql'ye benzer basit db yapısına sahip bazı basit uygulamalar yazmak harika . Alt belgelere sahip olmaya başladığınızda ve tüm bu çılgın sorguları yapmak istediğinizde, firavun faresi için bunu gerçekten zor buldum. İstediğiniz sorguyu nasıl yapacağınızı öğrenmek için mongodb dokümanlarına bakmalı, ardından firavun faresi dokümanlarına bakmalısınız. Bazen, mongodb'un X geleceğinin firavun faresinde olmadığını göreceksiniz, bu yüzden ham mongodb sürücüsüne gidip şu ya da bu yerde ham mongodb sorguları yazıyorsunuz. Firavun faresi olmadan, mongodb dokümanlarına bakarsınız ve sorgunuzu yaparsınız.


3
Ayrıca mongodb'un firavun faresinden daha iyi olduğunu düşünüyorum çünkü hızlı ve karmaşık sorgulama yapmak mümkün. Büyük uygulamalar için daha iyidir ve ham mongodb sürücüsü kullanmalısınız. Sana kesinlikle katılıyorum
Abdul Alim Şakir

Büyük bir uygulama yapmasanız bile size kesinlikle katılıyorum. Karmaşık sorgular, mongo sürücüsünde firavun faresinde yapmaya kıyasla çok daha kolay
Juan

14

Ben sadece mongodb kullandım. Kişisel görüşüme göre, düşük seviyeli bir şeyle başlamayı ve sonra yukarı çıkmayı tavsiye ederim. Aksi takdirde, firavun faresi gibi daha yüksek seviyeli sürücüler tarafından sağlanan ek gelişmiş özellikleri gerçek bir fayda sağlamayacak şekilde kullanırken bulabilirsiniz.

Node.js için endemik olan mongodb ile yaşadığım sorun zayıf dokümantasyondur. Belgeler ve birçoğu var ama her zaman en yararlı olanı değil. Şimdiye kadar gördüğüm kadarıyla, sürücünün üretim kullanımına dair iyi ve kapsamlı örnekler yok. Belgeler, bir bağlantı açma, bir komut verme ve bağlantıyı kapatma ile aynı şablon örneğiyle doldurulur. Bir şablondan kopyalanıp yapıştırıldığını söyleyebilirsiniz çünkü her örnek, yalnızca her örnek için gerekli olanı değil, ihtiyaç duyulabilecek her şeyi içerir.

Tamamen rastgele alınmış bir örnek vermek gerekirse:

  • ham {Boolean, varsayılan: false}, ham bson arabelleklerini kullanarak işlemleri gerçekleştirir.

"Ham bson arabelleklerini kullanarak işlemleri gerçekleştir" tam olarak ne yapar? Hiçbir yerde açıklanmadı ve bu kelime öbeği için bir Google araması yardımcı olmuyor. Belki daha fazla Google yapabilirdim ama buna gerek yok. Bilgi orada olmalı. Bu seçeneği etkinleştirmek / devre dışı bırakmak için herhangi bir performans, kararlılık, bütünlük, uyumluluk, taşınabilirlik veya işlevsel olarak avantaj var mı? Kodun derinliklerine dalmadan hiçbir fikrim yok ve eğer teknemdeyseniz bu ciddi bir sorun. Mükemmel sürekliliğin gerekli olmadığı ancak programın çalışma zamanında çok kararlı olması gereken bir arka plan programım var. Bunun, JSON için seriyi kaldırmamı ve serileştirmemi beklediği veya düşük seviyeli, dahili ve kullanıcı için şeffaf bir şey olduğu anlamına geldiğini varsayabilirim, ancak yanılıyor olabilirim. İyi varsayımlarda bulunma eğiliminde olsam da, hayati sistemler oluştururken varsayım ve tahminlere güvenemiyorum. Yani burada iddiamı kodla test edebilir veya Google'a veya kodlarına çok daha derine inebilirim. Tek seferlik olarak bu o kadar da kötü değil ama belgelerini okurken kendimi bu durumda buluyorum. Fark, bir göreve harcanan günlere karşı saat anlamına gelebilir. Doğrulamaya ihtiyacım var ve dokümantasyon, teyit bir yana, bana zar zor açıklama veriyor.

Dokümantasyon aceleye geldi. Olayları açıklamıyor, hataların ne zaman atıldığına veya bu hataların doğasına ilişkin belirsiz ayrıntılar veriyor ve çoğu kez bağlanabilirliği sağlamanın belirsiz olabilecek birkaç yolu var. Geçebilirsin ve tamamen yararsız değil, ama kenarlarda çok sert. Tahminlere ve deneylere bırakılan bazı şeyler bulacaksınız.


Harika belgelerle birlikte harika yazılımlar gelir. En önemli kısımlardan biridir.
Lukas Liesis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.