Javascript Node.js MongoDB在写入锁定到位时返回0个文档

Javascript Node.js MongoDB在写入锁定到位时返回0个文档,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个运行的简单节点服务器,它查询mongoDB并将文档返回给客户端进行处理。在后台,我有一个java应用程序,它从各种来源捕获数据,并作为批处理过程写入mongoDB实例。java应用程序还根据需要更新mongoDB实例中的记录。java应用程序大约每分钟执行一次,通常包括大约500个插入和1000个更新 Node.JS: var MongoClient = require('mongodb').MongoClient; var collection = ''; MongoClient.co

我有一个运行的简单节点服务器,它查询mongoDB并将文档返回给客户端进行处理。在后台,我有一个java应用程序,它从各种来源捕获数据,并作为批处理过程写入mongoDB实例。java应用程序还根据需要更新mongoDB实例中的记录。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的有效连接):

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上用
db.currentOp()
验证,在Node.js服务器上用
db.collection('$cmd.sys.inprog').findOne
验证),并返回0个文档。这是一个问题,因为我将此计数用于度量,并且需要某种方法来确保查询的完整性(可能是0个文档)。在Node.js的mongoDB包中是否有什么东西在写锁定到位时会尝试重试

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

2014年12月31日更新:

我正在使用的mongoDB查询(上面引用为“queryString”):

我应该注意到,99%的情况下,这个查询是完美的。我将有一些实例,在这些实例中,我按预期每分钟返回12个文档,持续数小时。然后,出于某种原因(我假设写锁阻止读取),我将返回0个文档

“有时出现”currentOp(仅为插入):


你的诊断对我来说没有多大意义-你正在发送单号搜索、更新和一些插入。因此,任何内容都不应该被写锁阻止很长时间。此外,如果由于写锁定而超时,则查询不应返回0,这只是错误的行为。您是否可以包括
currentOp
信息和实际的查询,并对其进行解释,尤其是得到0个结果的查询?代码看起来没什么问题,但它显然是从真实的东西修改过来的。@wdberkeley,更新了。@wdberkeley,我的更新回答了你的问题了吗?
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
[{"$or", [{"PRI":{"$gte":"1","$lte":"9"}}]},{"EVENTTIME":{"$gte":"2014:12:31::16:59:18"}}]
"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)
    }
}