При использовании .toArray()
, я знаю, что вы могли бы использовать db.close()
внутри обратного вызова следующим образом:Когда вы вызываете db.close() при использовании cursor.forEach()?
db.collection('grades').find(query).toArray(function(err, docs) {
if (err) throw err;
console.dir(docs);
db.close();
});
Но что, если вам нужно перебрать массив? Кажется чрезмерным: 1) итерация по курсору для построения массива, а затем 2) итерация по массиву для выполнения вашей работы. Поэтому я думал, что было бы неплохо использовать cursor.forEach()
.
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) {
if (err) throw err;
var cursor = db
.collection('data')
.find({})
.sort({State: 1, Temperature: -1});
var prevState = '';
var curr;
cursor.forEach(function(doc) {
if (doc.State === prevState) return;
db.collection('data').update(doc, { $set: { month_high: true}});
prevState = doc.State;
});
db.close();
});
Однако, это дает мне ошибку:
~/code/m101js $ node test.js
/Users/azerner/code/node_modules/mongodb/lib/utils.js:97
process.nextTick(function() { throw err; });
^
TypeError: undefined is not a function
at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:527:15
at handleCallback (/Users/azerner/code/node_modules/mongodb/lib/utils.js:95:12)
at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:493:22
at handleCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:234:5)
at /Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:533:22
at queryCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:167:20)
at Callbacks.flush (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:86:7)
at Server.destroy (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:694:41)
at Server.close (/Users/azerner/code/node_modules/mongodb/lib/server.js:344:17)
at Db.close (/Users/azerner/code/node_modules/mongodb/lib/db.js:273:19)
~/code/m101js $ node test.js
/Users/azerner/code/node_modules/mongodb/lib/utils.js:97
process.nextTick(function() { throw err; });
^
TypeError: undefined is not a function
at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:527:15
at handleCallback (/Users/azerner/code/node_modules/mongodb/lib/utils.js:95:12)
at /Users/azerner/code/node_modules/mongodb/lib/cursor.js:493:22
at handleCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:234:5)
at /Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:533:22
at queryCallback (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:167:20)
at Callbacks.flush (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:86:7)
at Server.destroy (/Users/azerner/code/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:694:41)
at Server.close (/Users/azerner/code/node_modules/mongodb/lib/server.js:344:17)
at Db.close (/Users/azerner/code/node_modules/mongodb/lib/db.js:273:19)
~/code/m101js $
Это, кажется, весь код библиотеки, и я не совсем уверен, как отлаживать его. Но похоже, что проблема заключается в db.close()
.
- Это так?
- Если да, то где еще я бы положил
db.close()
?
Зачем вам это закрыть? – adeneo
@adeneo Я не уверен. Я действительно принимаю [класс] (https://university.mongodb.com/courses/10gen/M101JS/2015_May/syllabus) и не совсем уверен, что я делаю. Но, если вы не закрываете это, вы никогда не захотите делать в этом сценарии, мой вопрос остается. –
Вообще говоря, я думаю, что большинство приложений просто подключится один раз и не откроет соединение, нет необходимости закрывать соединение для каждого вызова в БД – adeneo