2015-09-11 12 views
5


Sto tentando di eseguire un'aggregazione MongoDB e Nodejs, ma ho qualche difficoltà nell'esecuzione del progetto. Quando entro il seguente comando nella shell MongoDB:toArray undefined in NodeJS e MongoDB

db.data.aggregate([{$match: {}},{$group: {'_id': '$State', 'total': {'$sum': 1}} }]).toArray() 

allora sto ottenendo i risultati attesi.
Tuttavia, quando uso il seguente piccolo programma Nodejs

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { 
    if(err) throw err; 

    console.log("Connected correctly to server"); 

    var col=db.collection('data'); 

    col.aggregate([{$match: {}},{$group: {'_id': '$State', 'total': {'$sum': 1}} }]) 
    .toArray(function(err, result) {  
     if(err) throw err; 
     console.log(result);    
    }); 

    db.close(); 

}); 

allora sto ottenendo il messaggio di errore: 'TypeError: Impossibile leggere la proprietà 'toArray' undefined'

Qualcuno potrebbe aiutarmi?

Molte grazie in anticipo, Andi

+1

Il codice di cui sopra non mi dà il 'non può leggere errore proprietà di beni, ma non funziona perché la lettura è fatta in modo asincrono e _after_ la connessione è chiusa. Prova a rimuovere la riga 'db.close'. –

risposta

1

Come @ExplosionPills giustamente sottolineato, il codice non funzionerà come la registrazione è fatto in modo asincrono e dopo che la connessione è chiusa e quindi si può provare a rimuovere la linea db.close() o creare un funzione che fa uso di una funzione di callback per restituisce i risultati di aggregazione:

var aggregateStates = function(db, callback) { 
    db.collection('data').aggregate(
    [ 
     { $group: { "_id": "$State", "total": { $sum: 1 } } } 
    ] 
    ).toArray(function(err, result) { 
     console.log(result); 
     callback(result); 
    }); 
}; 

chiamare la funzione aggregateStates:

var MongoClient = require('mongodb').MongoClient; 
MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { 
    aggregateStates(db, function() { 
     db.close(); 
    }); 
}); 
1

In base a mongo-native driver doc, l'aggregato() restituisce null. Pertanto, toArray() non può essere chiamato da ciò che restituisce. Tuttavia, aggregate() accetta una callback che ha il risultato di aggregate() se ha successo. Quindi, ecco il codice rivisto:

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { 
    if(err) throw err; 

    console.log("Connected correctly to server"); 

    var col=db.collection('data'); 

    col.aggregate([ 
     {$match: {}}, 
     {$group: {'_id': '$State', 'total': {'$sum': 1}} } 
    ], function(err, result) { 
     if(err) { 
      db.close(); 
      throw err; 
     } 
     console.log(result); 
     db.close(); 
    }); 

}); 
Problemi correlati