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