Como posso saber a contagem de um modelo cujos dados foram salvos? existe um método de Model.count()
, mas não parece funcionar.
var db = mongoose.connect('mongodb://localhost/myApp');
var userSchema = new Schema({name:String,password:String});
userModel =db.model('UserList',userSchema);
var userCount = userModel.count('name');
userCount
é um objeto, qual método chamado pode obter um real count
?
obrigado
Respostas:
O código abaixo funciona. Observe o uso de countDocuments .
fonte
O motivo pelo qual seu código não funciona é porque a função de contagem é assíncrona, ela não retorna um valor de forma síncrona.
Aqui está um exemplo de uso:
fonte
count
método está obsoleto, você pode usar acountDocuments
mesma sintaxeO collection.count está obsoleto e será removido em uma versão futura. Use a coleção. countDocuments ou coleção. estimadoDocumentCount em vez disso.
fonte
UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a function
Recebo um erro ao usá-lo em meu próprio userModel?Você deve dar um objeto como argumento
ou
ou
Na versão recente do mongoose, count () está obsoleto, então use
fonte
Antecedentes para a solução
Conforme declarado na documentação do mangusto e na resposta de Benjamin, o método
Model.count()
está obsoleto. Em vez de usarcount()
, as alternativas são as seguintes:Model.countDocuments(filterObject, callback)
Conta quantos documentos correspondem ao filtro em uma coleção. Passar um objeto vazio {} como filtro executa uma verificação de coleção completa. Se a coleção for grande, o método a seguir pode ser usado.
Model.estimatedDocumentCount()
Este método de modelo estima o número de documentos na coleção MongoDB. Este método é mais rápido que o anterior
countDocuments()
, porque usa metadados de coleção em vez de percorrer toda a coleção. No entanto, como o nome do método sugere, e dependendo da configuração do banco de dados, o resultado é uma estimativa, pois os metadados podem não refletir a contagem real de documentos em uma coleção no momento da execução do método.Ambos os métodos retornam um objeto de consulta mongoose, que pode ser executado de uma das seguintes maneiras. Use
.exec()
se quiser executar uma consulta posteriormente.A solução
Opção 1: passe uma função de retorno de chamada
Por exemplo, conte todos os documentos em uma coleção usando
.countDocuments()
:Ou conte todos os documentos em uma coleção com um determinado nome usando
.countDocuments()
:Opção 2: usar
.then()
Uma consulta de mangusto tem
.then()
é "thenable". Isso é para conveniência e a consulta em si não é uma promessa.Por exemplo, conte todos os documentos em uma coleção usando
.estimatedDocumentCount()
:Opção 3: usar assíncrono / esperar
Ao usar a abordagem async / await, a maneira recomendada é usá-la com,
.exec()
pois ela fornece rastreamentos de pilha melhores.Aprendendo pelo overflowing da pilha,
fonte
As respostas com maior votação aqui estão perfeitamente bem. Eu só quero adicionar o uso de await para que a funcionalidade solicitada possa ser arquivada:
É recomendado usar countDocuments () em vez de 'count ()', pois será obsoleto a partir de agora. Então, por enquanto, o código perfeito seria:
fonte
Como disse antes, seu código não funcionará do jeito que está. Uma solução para isso seria usar uma função de retorno de chamada, mas se você acha que isso o levaria a um 'inferno de retorno de chamada', você pode pesquisar por "Promessas".
Uma possível solução usando uma função de retorno de chamada:
se quiser pesquisar o número de documentos com base em uma consulta, você pode fazer o seguinte:
setNumberofDocuments é uma função separada:
Agora você pode obter o número de documentos em qualquer lugar com um getFunction:
Além disso, você usa esta função assíncrona dentro de uma função síncrona usando um retorno de chamada, por exemplo:
Espero que possa ajudar outras pessoas. :)
fonte