我对MongoDB有一个奇怪的问题。我的数据库集合正在关闭,我认为这应该是它应该做的(我从mongo样板文件中跟随)但是我没有看到为什么文档将为null值。我已经按照我能想到的每一种方式检查了这个,但我不太了解光标对象。
Console.logging它似乎给了我一堆本机mongo属性(看起来像函数,即每个,toArray等)所以看起来是正确的,但它不是一个我可以看到的数据字段的常规对象。 / p>
在遇到if if(docs == null)的if块之后,连接被关闭,并且它将不执行else中的每个块。
理想情况下,如果有一种方法可以帮助排除故障或弄清楚如何执行此操作会很棒。
更多背景: 在我可以要求的mongo shell中 使用天气//没问题 并使用空的find();
获取数据对象的结果,即3000条记录var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) {
if(err){
console.log("line 7" + err);
}
var query = {};
var projection = { 'State' : 1, 'Temperature' : 1 };
var cursor = db.collection('data').find(query, projection);
console.log("cursor" + cursor); // [object Object]
var state = '';
var operator = {'$set' : {'month_high' : true } };
cursor.each(function(err, doc) {
if (err) throw err;
if (doc == null) {
console.log("docs have value:" + doc); //NULL VALUE so will close on line 23
return db.close();
} else if (doc.State !== state) {
// first record for each state is the high temp one
state = doc.State;
db.collection('data').update( {'_id':doc._id}, operator, function(err, updated) {
if (err) console.log(err);
// return db.close(); ?
});
}
});
});
{ [MongoError: Connection Closed By Application] name: 'MongoError' } //doh
{ [MongoError: Connection Closed By Application] name: 'MongoError' } //doh
{ [MongoError: Connection Closed By Application] name: 'MongoError' } //doh
答案 0 :(得分:1)
确定何时调用db.close()可能有点乱。在这里,它会被find().toArray()
重写,加上一些逻辑来测试您何时更新最后匹配的文档。这对我有用。
var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var Q = require('q');
MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) {
assert.equal(null, err);
var query = {};
var projection = { 'State' : 1, 'Temperature' : 1 };
var state = '';
var operator = {'$set' : {'month_high' : true } };
var promises = [];
db.collection('data').find(query, projection).toArray(function(err, docs) {
assert.equal(null, err);
docs.forEach(function(doc, index, arr) {
var deferred = Q.defer();
promises.push(deferred.promise);
if (null !== doc && state !== doc.State) {
db.collection('data').update( {'_id':doc._id}, operator, function(err, updated) {
assert.equal(null, err);
console.log("Updated "+updated+" documents.");
deferred.resolve();
});
} else {
deferred.resolve();
}
});
Q.all(promises).done(function() {
console.log("closing");
db.close()
});
});
});
编辑:添加了Q,因为在某些情况下仍然会过早调用db.close()。