Node.js MongoDB返回0文件,而写locking在位

我有一个简单的节点服务器运行查询mongoDB并将文档返回给客户端进行处理。 在后台,我有一个Java应用程序捕获来自各种来源的数据,并作为批处理写入到mongoDB实例。 java应用程序还会根据情况更新mongoDB实例中的logging。 java应用程序大约每分钟执行一次,通常包括大约500个插入和1000个更新。

Node.js的:

var MongoClient = require('mongodb').MongoClient; var collection = ''; MongoClient.connect('pathToMongo', function(err, db){ collection = db.collection('mycollection'); }); ... app.get('/getData', function(req, res){ collection.find(queryString, {_id: 0, createdAt: 0}).sort({EVENTTIME:-1}).toArray(function(err,docs){ if (err){ console.log(err); res.send(500,err); } else { res.json(docs); } }); }); 

Java片段(假设我已经有了所有的数据在result插入/更新,并且有效连接到mongoDB):

 public static void doWork(DBCollection coll){ while(result.next()){ BasicDBObject tempDoc = new BasicDBObject(); //Add values to tempDoc based on result iteration DBObject unchanged = coll.findOne(tempDoc); if (unchanged != null){ //update existing record DBObject modifiedObject = new BasicDBObject(); modifiedObject.put("$inc", new BasicDBObject().append("cyclesUnchanged", 1)); coll.update(unchanged, modifiedObject, false, false); } else { //insert record coll.insert(tempDoc); } } } 

初始化java Mongo实例:

 MongoClient mongoClient; DB db; DBCollection coll = null; try{ mongoClient = new MongoClient('localhost", 27017); db = mongoClient.getDB("test"); coll = db.getCollection("mycollection"); } catch (Exception e){ System.out.println("Mongo Error."); System.exit(0); } final DBCollection newColl = coll; doWork(newColl); //call to method above 

我的节点服务器返回大部分时间我期待的文档的确切数量(所以这不是查询问题)。 但偶尔,查询会碰到一个写入锁(通过在mongod AND db.collection('$cmd.sys.inprog').findOne服务器上的db.currentOp()validation),并返回0个文档。 这是一个问题,因为我使用此计数作为度量标准,并且需要某种方法来确保我的查询(可能是0个文档)的完整性。 Node.js的mongoDB软件包中是否有某些东西在试图重新写入locking?

我正在运行MongoDB v2.6,mongo java驱动程序v2.12.3和Node.js v0.10.29。

更新12/31/2014:

我正在使用的mongoDB查询(以上引用为'queryString'):

 [{"$or", [{"PRI":{"$gte":"1","$lte":"9"}}]},{"EVENTTIME":{"$gte":"2014:12:31::16:59:18"}}] 

我应该注意到,这个查询,99%的时间,完美地工作。 我会遇到这样的情况:如预期的那样,每分钟返回12个文档,几个小时。 然后,由于某种原因(我假设一个写锁是防止读取),我会得到0文件返回。

“有时出现”currentOp(这只是一个插入):

 "opid" : 71715202, "active" : true, "secs_running" : 0, "microsecs_running" : NumberLong(251), "op" : "insert", "ns" : "test.mycollection", "insert" : { "_id" : ObjectId("54a429a2880cc7fb7d2236465"), "altID" : "999999", "PRI" : "9", "EVENTTIME" : "2014:12:31::17:55:12", "LAT" : "0", "LON" : "0", "createdAt" : ISODate("2014-12-31T16:51:46.250Z") }, "client" : "127.0.0.1:60750", "desc" : "conn171", "connectionId" : 171, "locks" : { "^" : "w", "^test" : "W" }, "waitingForLock" : false, "numYields" : 0, "lockStats" : { "timeLockedMicros" : { }, "timeAcquiringMicros" : { "r" : NumberLong(0), "w" : NumberLong(3) } }