Wie bekomme ich alle Mungo-Modelle?


101

Wie kann ich die Anzahl der Modelle ermitteln, für die Daten gespeichert wurden? Es gibt eine Methode von Model.count(), aber es scheint nicht zu funktionieren.

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');

userCountist ein Objekt, welche Methode kann ein reales bekommen count?

Vielen Dank


1
Wenn Sie ES 2016 verwenden, können Sie den Anruf so einschließen, dass er innerhalb eines Versprechens zählt, und ihn mit einem Generator aufrufen.
MikeyGlitz

Antworten:


125

Der folgende Code funktioniert. Beachten Sie die Verwendung von countDocuments .

 var mongoose = require('mongoose');
 var db = mongoose.connect('mongodb://localhost/myApp');
 var userSchema = new mongoose.Schema({name:String,password:String});
 var userModel =db.model('userlists',userSchema);
 var anand = new userModel({ name: 'anand', password: 'abcd'});
 anand.save(function (err, docs) {
   if (err) {
       console.log('Error');
   } else {
       userModel.countDocuments({name: 'anand'}, function(err, c) {
           console.log('Count is ' + c);
      });
   }
 }); 

150

Der Grund, warum Ihr Code nicht funktioniert, ist, dass die Zählfunktion asynchron ist und keinen Wert synchron zurückgibt.

Hier ist ein Anwendungsbeispiel:

userModel.count({}, function( err, count){
    console.log( "Number of users:", count );
})

Geben Sie mir ein Beispiel, um
eine zählsynchrone

Auch für mich. Ich suche das gleiche
nowox

11
countMethode ist beraubt, können Sie die countDocumentsgleiche Syntax verwenden
Kir Novak

@ KirNovak Danke Bruder. Ich habe auch die URL in Mungo für die Abwertung angegeben .
Tes3awy

25

Die collection.count ist veraltet und wird in einer zukünftigen Version entfernt. Sammlung verwenden. countDocuments oder Sammlung. Stattdessen wird geschätzter DokumentCount angezeigt.

userModel.countDocuments(query).exec((err, count) => {
    if (err) {
        res.send(err);
        return;
    }

    res.json({ count: count });
});


Ich hatte das Problem, dass in unserem Projekt eine Setup-Routine für vorhandene Objekte in beliebigen Sammlungen testet. Die Methode count () verhielt sich seltsam: Wenn die Sammlung nicht leer war, gab sie manchmal nichts zurück (undefiniert, null, null oder falsch - wir konnten sie nicht weiter untersuchen). Wir haben immer noch nicht herausgefunden, was das Problem verursacht hat, da es sich um eine Rennbedingung handelte, die sehr selten auftrat. Die Verwendung von countDocuments ({}) funktioniert jetzt bei uns. Danke dir!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a functionIch erhalte eine Fehlermeldung, wenn ich es auf meinem eigenen userModel verwende.
Luke Brown

Wie können wir "userModel.countDocuments" als synchronen Aufruf ausführen, damit ich dem Schema ein virtuelles Element hinzufügen kann, das meinem Dokument einen "Schlüssel und Wert" hinzufügt?
Satyam

25

Sie sollten ein Objekt als Argument angeben

userModel.count({name: "sam"});

oder

userModel.count({name: "sam"}).exec(); //if you are using promise

oder

userModel.count({}); // if you want to get all counts irrespective of the fields

In der aktuellen Version von Mungo ist count () veraltet. Verwenden Sie daher

userModel.countDocuments({name: "sam"});

2
DeprecationWarning: collection.count ist veraltet. Verwenden Sie stattdessen .estimatedDocumentCount () oder .countDocuments ().
HMagdy

9

Hintergrund für die Lösung

Wie in der Mungo-Dokumentation und in der Antwort von Benjamin angegeben, ist die Methode Model.count()veraltet. Anstatt zu verwenden count(), sind die Alternativen die folgenden:

Model.countDocuments(filterObject, callback)

Zählt, wie viele Dokumente mit dem Filter in einer Sammlung übereinstimmen. Wenn Sie ein leeres Objekt {} als Filter übergeben, wird ein vollständiger Sammlungsscan ausgeführt. Wenn die Sammlung groß ist, kann die folgende Methode verwendet werden.

Model.estimatedDocumentCount()

Diese Modellmethode schätzt die Anzahl der Dokumente in der MongoDB-Sammlung. Diese Methode ist schneller als die vorherige countDocuments(), da Sammlungsmetadaten verwendet werden, anstatt die gesamte Sammlung zu durchlaufen. Wie der Methodenname andeutet und abhängig von der Datenbankkonfiguration, ist das Ergebnis eine Schätzung, da die Metadaten möglicherweise nicht die tatsächliche Anzahl der Dokumente in einer Sammlung zum Zeitpunkt der Methodenausführung widerspiegeln.

Beide Methoden geben ein Mungo-Abfrageobjekt zurück, das auf eine der folgenden zwei Arten ausgeführt werden kann. Verwenden .exec()Sie diese Option, wenn Sie eine Abfrage zu einem späteren Zeitpunkt ausführen möchten.

Die Lösung

Option 1: Übergeben Sie eine Rückruffunktion

Zählen Sie beispielsweise alle Dokumente in einer Sammlung mit .countDocuments():

someModel.countDocuments({}, function(err, docCount) {
    if (err) { return handleError(err) } //handle possible errors
    console.log(docCount)
    //and do some other fancy stuff
})

Oder zählen Sie alle Dokumente in einer Sammlung mit einem bestimmten Namen mit .countDocuments():

someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
    //see other example
}

Option 2: Verwenden .then()

Eine Mungo-Abfrage hat .then()also "thenable". Dies dient der Bequemlichkeit und die Abfrage selbst ist kein Versprechen.

Zählen Sie beispielsweise alle Dokumente in einer Sammlung mit .estimatedDocumentCount():

someModel
    .estimatedDocumentCount()
    .then(docCount => {
        console.log(docCount)
        //and do one super neat trick
    })
    .catch(err => {
        //handle possible errors
    })

Option 3: Verwenden Sie async / await

Wenn Sie den asynchronen / wartenden Ansatz verwenden, wird empfohlen , ihn mit zu verwenden, .exec()da er bessere Stapelspuren bietet.

const docCount = await someModel.countDocuments({}).exec();

Lernen durch Stapelüberlauf,


1

Die Antworten mit den höchsten Stimmen hier sind vollkommen in Ordnung. Ich möchte nur die Verwendung von await addieren, damit die angeforderte Funktionalität archiviert werden kann:

const documentCount = await userModel.count({});
console.log( "Number of users:", documentCount );

Es wird empfohlen, countDocuments () anstelle von 'count ()' zu verwenden, da dies im Laufe der Zeit veraltet sein wird. Im Moment wäre der perfekte Code also:

const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );

-1

Wie bereits erwähnt, funktioniert Ihr Code nicht so, wie er ist. Eine Lösung hierfür wäre die Verwendung einer Rückruffunktion. Wenn Sie jedoch der Meinung sind, dass Sie dadurch zu einer "Rückrufhölle" gelangen, können Sie nach "Versprechungen" suchen.

Eine mögliche Lösung mit einer Rückruffunktion:

//DECLARE  numberofDocs OUT OF FUNCTIONS
     var  numberofDocs;
     userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

Wenn Sie die Anzahl der Dokumente anhand einer Abfrage durchsuchen möchten, haben Sie folgende Möglichkeiten:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

setNumberofDocuments ist eine separate Funktion:

var setNumberofDocuments = function(err, count){ 
        if(err) return handleError(err);

        numberofDocs = count;

      };

Jetzt können Sie die Anzahl der Dokumente mit einer getFunction überall abrufen:

     function getNumberofDocs(){
           return numberofDocs;
        }
 var number = getNumberofDocs();

Darüber hinaus verwenden Sie diese asynchrone Funktion innerhalb einer synchronen Funktion mithilfe eines Rückrufs. Beispiel:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){

       userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

       setNumberofDocuments(true);


} 

Hoffe es kann anderen helfen. :) :)


Warum rufen Sie in der Funktion berechneNumberOfDoc () setNumberofDocuments (true) auf? Würde es nicht zuerst zu einem Fehler führen, noch bevor die tatsächliche Anzahl zurückgegeben wird?
Pravin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.