2015-09-11 2 views
5


Próbuję uruchomić agregację MongoDB i Nodejs, ale mam pewne trudności w uruchomieniu projektu. Kiedy wprowadź następujące polecenie w powłoce MongoDB:toArray undefined w NodeJS i MongoDB

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

następnie otrzymuję spodziewanych rezultatów.
Jednak, kiedy użyć następującego trochę Nodejs programu

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

}); 

następnie otrzymuję komunikat o błędzie: „TypeError: nie można odczytać właściwość«ToArray»undefined”

Czy ktoś mógłby mi pomóc?

Wiele z góry dzięki Andi

+1

Powyższy kod nie daje mi 'nie może odczytać property' błąd, ale to nie będzie działać, ponieważ odczyt odbywa się asynchronicznie i _after_ połączenie zostanie zamknięte. Spróbuj usunąć linię 'db.close'. –

Odpowiedz

1

Jak @ExplosionPills prawidłowo wskazał, Twój kod nie będzie działać jako wyrębu odbywa się asynchronicznie i po jego zakończeniu, więc można spróbować usunąć linię db.close() lub utworzyć funkcja, która sprawia, że ​​korzystanie z funkcji wywołania zwrotnego do zwrotu wyniki agregacji:

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

wywołać funkcję aggregateStates:

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

Zgodnie z mongo-native driver doc, aggregate() zwraca wartość null. Dlatego funkcja toArray() nie może być wywołana z tego, co zwraca. Jednak aggregate() pobiera wywołanie zwrotne, które ma wynik aggregate(), jeśli się powiedzie. Więc tutaj jest zaktualizowany kod:

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(); 
    }); 

});