¿Cómo puedo saber el recuento de un modelo cuyos datos se han guardado? hay un método de Model.count()
, pero no 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
es un objeto, ¿qué método llamado puede obtener un real count
?
Gracias
Respuestas:
El siguiente código funciona. Tenga en cuenta el uso de countDocuments .
fuente
La razón por la que su código no funciona es porque la función de recuento es asincrónica, no devuelve un valor sincrónicamente.
Aquí hay un ejemplo de uso:
fuente
count
El método está depricado, puede usar lacountDocuments
misma sintaxisCollection.count está obsoleto y se eliminará en una versión futura. Usar colección. countDocuments o colección. EstimatedDocumentCount en su lugar.
fuente
UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a function
¿Recibo un error al usarlo en mi propio modelo de usuario?Deberías dar un objeto como argumento
o
o
En la versión reciente de mangosta, count () está en desuso, así que use
fuente
Antecedentes de la solución
Como se indica en la documentación de mangosta y en la respuesta de Benjamin, el método
Model.count()
está en desuso. En lugar de utilizarcount()
, las alternativas son las siguientes:Model.countDocuments(filterObject, callback)
Cuenta cuántos documentos coinciden con el filtro en una colección. Pasar un objeto vacío {} como filtro ejecuta un escaneo de colección completo. Si la colección es grande, se puede utilizar el siguiente método.
Model.estimatedDocumentCount()
Este método de modelo estima el número de documentos de la colección MongoDB. Este método es más rápido que el anterior
countDocuments()
, porque utiliza metadatos de colección en lugar de pasar por toda la colección. Sin embargo, como sugiere el nombre del método, y dependiendo de la configuración de la base de datos, el resultado es una estimación, ya que es posible que los metadatos no reflejen el recuento real de documentos en una colección en el momento de ejecución del método.Ambos métodos devuelven un objeto de consulta mongoose, que se puede ejecutar de una de las dos formas siguientes. Úselo
.exec()
si desea ejecutar una consulta más adelante.La solución
Opción 1: pasar una función de devolución de llamada
Por ejemplo, cuente todos los documentos de una colección usando
.countDocuments()
:O cuente todos los documentos de una colección que tengan un nombre determinado utilizando
.countDocuments()
:Opción 2: usar
.then()
Una consulta de mangosta tiene
.then()
por lo que es "thenable". Esto es por conveniencia y la consulta en sí no es una promesa.Por ejemplo, cuente todos los documentos de una colección usando
.estimatedDocumentCount()
:Opción 3: usar async / await
Cuando se usa el enfoque asíncrono / espera, la forma recomendada es usarlo con
.exec()
ya que proporciona mejores seguimientos de pila.Aprendiendo por stackoverflowing,
fuente
Las respuestas más votadas aquí están perfectamente bien, solo quiero agregar el uso de await para que la funcionalidad solicitada se pueda archivar:
Se recomienda usar countDocuments () sobre 'count ()', ya que quedará obsoleto. Entonces, por ahora, el código perfecto sería:
fuente
Como se dijo antes, el código no funcionará como está. Una solución sería usar una función de devolución de llamada, pero si cree que lo llevaría a un 'infierno de devolución de llamada', puede buscar "Promesas".
Una posible solución usando una función de devolución de llamada:
si desea buscar la cantidad de documentos en función de una consulta, puede hacer esto:
setNumberofDocuments es una función separada:
Ahora puede obtener la cantidad de documentos en cualquier lugar con una función getFunction:
Además, usa esta función asincrónica dentro de una sincrónica usando una devolución de llamada, ejemplo:
Espero que pueda ayudar a otros. :)
fuente