mongoose vs mongodb (módulos / extensões nodejs), qual melhor? e porque?

109

Acabei de chegar ao Node.js e vi que existem muitas libs para usar com o MongoDB, as mais populares parecem ser estas duas: (mongoose e mongodb). Posso obter prós e contras dessas extensões? Existem alternativas melhores para esses dois?

Edit: Encontrou uma nova biblioteca que parece também interessante node-mongolian e é "Mongolian DeadBeef é um driver node.js Mongo DB incrível que tenta se aproximar do shell mongodb." (readme.md)

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

Isso é apenas para adicionar mais recursos para novas pessoas que visualizam isso, então basicamente Mongol é como um ODM ...

norman784
fonte
Por que usar uma camada de esquema para um banco de dados sem esquema. Se você quiser um banco de dados baseado em esquema, use outra coisa que foi construída para ele. (Mongoose é apenas uma abstração de esquema de mongodb)
Simon Dragsbæk

Respostas:

123

O Mongoose é de nível superior e usa o driver MongoDB (é uma dependência, verifique o package.json), então você o usará de qualquer maneira dadas essas opções. A pergunta que você deveria estar se perguntando é: "Quero usar o driver bruto ou preciso de uma ferramenta de modelagem de objeto-documento?" Se você está procurando por uma ferramenta de modelagem de objeto (ODM, uma contraparte dos ORMs do mundo SQL) para pular algum trabalho de nível inferior, você quer o Mongoose.

Se você quiser um driver, porque pretende quebrar muitas regras que um ODM pode impor, vá com MongoDB. Se você quer um driver rápido e pode viver com alguns recursos ausentes, experimente o Mongolian DeadBeef: https://github.com/marcello3d/node-mongolian

cjohn
fonte
34

O Mongoose é, de longe, o mais popular. Eu o uso, e não usei outros. Portanto, não posso falar sobre os outros, mas posso lhe contar minhas queixas com o Mangusto.

  • Documentação difícil / pobre
  • Modelos são usados. E eles definem a estrutura de seus documentos. No entanto, isso parece estranho para o Mongo, onde uma de suas vantagens é que você pode adicionar uma coluna (errou, atributo?) Ou simplesmente não adicionar uma.
  • Os modelos diferenciam maiúsculas de minúsculas - eu e outros desenvolvedores com quem trabalho tivemos problemas em que a capitalização do nome da coleção com a qual o modelo está definido pode fazer com que ele não salve nada, sem erro. Descobrimos que usar todos os nomes em letras minúsculas funciona melhor. Por exemplo, em vez de fazer algo como mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })é melhor fazer (embora o nome da coleção seja realmente MyCollection):mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

Mas, honestamente, é muito útil. O maior problema é a documentação. Está lá, mas é seco e difícil de encontrar o que você precisa. Ele poderia usar melhores explicações e mais exemplos. Mas uma vez que você supera essas coisas, funciona muito, muito bem.

Marshall
fonte
11
Re: documentação. Eu não poderia concordar mais. A documentação é ruim e para piorar as coisas, está incorreta em alguns lugares. Muitas vezes me peguei quebrando o código (o que não é tão ruim), mas devido a problemas de documentação.
JP Richardson
1
Os nomes de coleção AFAIK diferenciam maiúsculas de minúsculas no Mongo, não no Mongoose.
Nick Campbell
34
Caso alguém esteja se perguntando, a documentação está boa agora.
Kevin Beal
7
Não concordo, a documentação ainda está atrasada.
Steve K
5
Também concordaria que a documentação ainda está faltando
Brendan Weinstein
25

Estou construindo um novo aplicativo e projetando agora a estrutura dele. Aqui estão algumas idéias sobre por que usar ou não o mangusto:

  1. O Mongoose será mais lento (para aplicativos grandes)
  2. O Mongoose é mais difícil com consultas mais complicadas
  3. Haverá situações em que você deseja mais velocidade e irá optar por ir sem mangusto, então você terá metade consultas com mangusto e metade sem. Que situação maluca, uma vez ..
  4. O Mongoose fará com que você codifique mais rápido com aplicativos simples com estrutura de banco de dados simples
  5. O Mongoose fará com que você leia a documentação do mongodb E a documentação do mongoose
  6. Com o mongoose, sua pilha terá mais uma coisa em que depender e é mais uma possibilidade de quebrar e queimar até as cinzas.

O driver mongodb é um driver bruto, você se comunica diretamente com o mongodb. mangusto é a camada de abstração. Você obtém E / S mais fácil para o banco de dados enquanto sua estrutura de banco de dados é simples o suficiente.

A abstração traz seus requisitos e você deve segui-los. Seu aplicativo ficará mais lento, consumirá mais RAM e será mais complicado, mas se você souber como usá-lo, poderá escrever objetos simples mais rapidamente, salvá-los no banco de dados.

Sem o mongoose, você terá uma aplicação mais rápida com conexão direta ao mongodb. Ninguém diz que você não pode escrever seus próprios modelos para salvar coisas no banco de dados. Você pode. E acho que é mais fácil. Você escreve o código, o qual usará, você sabe o que precisa. Sua camada de abstração será bem menor que a do mangusto.

Estou vindo do mundo do PHP, lá tínhamos sql bruto com funções mysql_ depreciadas, então temos PDO - camada de abstração orientada a objeto para se comunicar com sql. Ou você pode escolher algum ORM pesado como o Doctrine para ter coisas semelhantes ao mongoose no mongoDB. Objetos com método setter / getters / save e assim por diante. Tudo bem, mas ao adicionar mais abstração, você está adicionando mais arquivos, mais lógica, mais documentação, mais dependências. Gosto de manter as coisas simples e ter menos dependências na minha pilha. BTW, foi por isso que mudei de PHP para Javascript cliente-servidor em primeiro lugar.

Com o mongoose eu acho ótimo escrever alguns aplicativos simples, que têm uma estrutura de banco de dados simples semelhante ao sql . Quando você começa a ter subdocumentos e quer fazer todas aquelas pesquisas malucas, achei muito difícil com o mangusto. Você deve consultar os documentos do mongodb e, em seguida, consultar os documentos do mongoose para descobrir como fazer a consulta desejada. Algumas vezes você descobrirá que o futuro X do mongodb não está no mongoose, então você vai até o driver mongodb bruto e escreve consultas mongodb brutas em um ou outro lugar. Sem o mongoose, você olha os documentos do mongodb e faz sua consulta.

Lukas Liesis
fonte
3
Eu também acho que mongodb é melhor do que mongoose porque é rápido e possível fazer consultas complexas. É melhor para aplicativos grandes e você deve usar o driver mongodb bruto. Eu concordo fortemente com você.
Abdul Alim Shakir
Eu concordo totalmente com você, mesmo se você não estiver fazendo um grande aplicativo. Consultas complexas são muito mais fáceis no driver mongo em comparação com o mongoose
Juan
14

Eu usei apenas mongodb. Na minha opinião pessoal, eu recomendaria começar com algo de baixo nível e depois subir. Caso contrário, você pode acabar usando os recursos avançados adicionais fornecidos por drivers de nível superior, como o mongoose, sem nenhum benefício real.

O problema que tive com o mongodb, que é endêmico para node.js, é a documentação deficiente. Existe documentação e muita, mas nem sempre é a mais útil. Que eu vi até agora, não há exemplos bons e completos de uso do driver na produção. A documentação é preenchida com o mesmo modelo de exemplo de abrir uma conexão, emitir um comando e fechar a conexão. Você pode saber se é copiado e colado de um modelo porque cada exemplo inclui o necessário para tudo o que pode ser necessário, em vez de apenas o que é necessário para cada exemplo.

Para dar um exemplo tomado inteiramente ao acaso:

  • raw {Boolean, default: false}, executa operações usando buffers bson brutos.

O que exatamente "executar operações usando buffers bson brutos" faz? Não consigo encontrar uma explicação em nenhum lugar e uma pesquisa no Google por essa frase não ajuda. Talvez eu pudesse pesquisar mais no Google, mas não deveria. A informação deve estar lá. Existe alguma vantagem de desempenho, estabilidade, integridade, compatibilidade, portabilidade ou funcionalidade para ativar / desativar esta opção? Eu realmente não tenho ideia sem mergulhar profundamente no código e se você estiver no meu barco, isso é um problema sério. Eu tenho um daemon onde a persistência perfeita não é necessária, mas o programa precisa ser muito estável em tempo de execução. Eu poderia supor que isso significa que ele espera que eu desserialize e serialize para JSON ou é algo de baixo nível, interno e transparente para o usuário, mas posso estar errado. Embora eu tendo a fazer boas suposições, não posso confiar em suposições e suposições ao fazer sistemas vitais. Portanto, aqui posso testar minha afirmação com código ou me aprofundar no Google ou no código deles. Como uma pessoa isolada, isso não é tão ruim, mas eu me encontro nessa situação muitas vezes ao ler sua documentação. A diferença pode significar dias gastos em uma tarefa versus horas. Preciso de confirmação e a documentação quase não me dá explicação, muito menos confirmação.

A documentação é apressada. Ele não explica eventos, dá detalhes vagos sobre quando os erros são lançados ou a natureza desses erros e, muitas vezes, há várias maneiras de realizar a conectividade que podem não ser claras. Você pode sobreviver e não é completamente inútil, mas é muito difícil nas bordas. Você descobrirá que algumas coisas são deixadas para adivinhação e experimentação.

jgmjgm
fonte
Com uma excelente documentação, vem um ótimo software. É uma das partes mais importantes.
Lukas Liesis