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

时间:2014-12-30 18:54:15

标签: javascript node.js mongodb

我有一个简单的节点服务器,它运行查询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的有效连接):

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上使用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'上面):

[{"$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)
    }
}

0 个答案:

没有答案