Comment puis-je connaître le nombre de modèles dont les données ont été enregistrées? il existe une méthode Model.count()
, mais cela ne semble pas fonctionner.
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
est un objet, quelle méthode appelée peut obtenir un réel count
?
Merci
Réponses:
Le code ci-dessous fonctionne. Notez l'utilisation de countDocuments .
la source
La raison pour laquelle votre code ne fonctionne pas est que la fonction de comptage est asynchrone, elle ne renvoie pas de valeur de manière synchrone.
Voici un exemple d'utilisation:
la source
count
méthode est obsolète, vous pouvez utiliser lacountDocuments
même syntaxeLe collection.count est obsolète et sera supprimé dans une version ultérieure. Utilisez la collection. countDocuments ou collection. EstiméDocumentCount à la place.
la source
UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a function
J'obtiens une erreur lors de son utilisation sur mon propre userModel?Vous devriez donner un objet comme argument
ou
ou
Sur la version récente de mongoose, count () est obsolète donc utilisez
la source
Contexte de la solution
Comme indiqué dans la documentation mangouste et dans la réponse de Benjamin, la méthode
Model.count()
est obsolète. À la place d'utilisercount()
, les alternatives sont les suivantes:Model.countDocuments(filterObject, callback)
Compte le nombre de documents correspondant au filtre dans une collection. Passer un objet vide {} comme filtre exécute une analyse complète de la collection. Si la collection est volumineuse, la méthode suivante peut être utilisée.
Model.estimatedDocumentCount()
Cette méthode de modèle estime le nombre de documents dans la collection MongoDB. Cette méthode est plus rapide que la précédente
countDocuments()
, car elle utilise les métadonnées de la collection au lieu de parcourir toute la collection. Cependant, comme le nom de la méthode l'indique et en fonction de la configuration de la base de données, le résultat est une estimation car les métadonnées peuvent ne pas refléter le nombre réel de documents dans une collection au moment de l'exécution de la méthode.Les deux méthodes renvoient un objet de requête mangouste, qui peut être exécuté de l'une des deux manières suivantes. À utiliser
.exec()
si vous souhaitez exécuter une requête ultérieurement.La solution
Option 1: passer une fonction de rappel
Par exemple, comptez tous les documents d'une collection en utilisant
.countDocuments()
:Ou, comptez tous les documents d'une collection portant un certain nom en utilisant
.countDocuments()
:Option 2: utilisation
.then()
Une requête mangouste a
.then()
donc elle est «alorsable». Ceci est pour une commodité et la requête en elle-même n'est pas une promesse.Par exemple, comptez tous les documents d'une collection en utilisant
.estimatedDocumentCount()
:Option 3: utiliser async / await
Lorsque vous utilisez l'approche async / await, la méthode recommandée est de l'utiliser avec
.exec()
car elle fournit de meilleures traces de pile.Apprendre par stackoverflowing,
la source
Les réponses aux votes les plus élevés ici sont parfaitement bien.Je veux juste additionner l'utilisation de wait pour que la fonctionnalité demandée puisse être archivée:
Il est recommandé d'utiliser countDocuments () sur 'count ()' car il sera obsolète en cours. Donc, pour l'instant, le code parfait serait:
la source
Comme dit précédemment, votre code ne fonctionnera pas comme il est. Une solution à cela serait d'utiliser une fonction de rappel, mais si vous pensez que cela vous mènerait à un «enfer de rappel», vous pouvez rechercher «Promisses».
Une solution possible utilisant une fonction de rappel:
si vous souhaitez rechercher le nombre de documents en fonction d'une requête, vous pouvez le faire:
setNumberofDocuments est une fonction séparée:
Vous pouvez maintenant obtenir le nombre de documents n'importe où avec une fonction getFunction:
De plus, vous utilisez cette fonction asynchrone dans une fonction synchrone en utilisant un rappel, exemple:
J'espère que cela peut aider les autres. :)
la source