2014-11-03 21 views
2

我有一个奇怪的问题与MongoDB。我的数据库集合正在关闭,我认为它是应该做的(我从mongo样板文件继续),但是我没有看到为什么文档是空值的原因。我已经按照我能想到的方式检查过了,但我不太了解游标对象。它似乎给了我一堆本地mongo属性(它看起来像函数,即每个,toArray等),所以它看起来是正确的,但它不是一个具有我可以看到的数据字段的常规对象。NodeJS错误与股票Mongodb适配器:连接关闭应用程序

它碰到if if(docs == null)后阻塞,连接会关闭,并且不会执行else if中的每个块。

理想情况下,如果有一种方法可以帮助排除故障或弄清楚如何使这个执行很好。

更多的背景: 在蒙戈外壳,我可以问 使用天气//没有问题 和获取数据对象,它是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 

回答

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

编辑:自db.close加Q()仍然在某些情况下,过早地叫。