Javascript 如何使用node.js在MongoDB中查找下一个文档
理想情况下,我希望能够比较cursor对象和以下cursor.next()对象的数据,以便执行其他函数 以下代码导致未定义Javascript 如何使用node.js在MongoDB中查找下一个文档,javascript,node.js,mongodb,mongodb-query,Javascript,Node.js,Mongodb,Mongodb Query,理想情况下,我希望能够比较cursor对象和以下cursor.next()对象的数据,以便执行其他函数 以下代码导致未定义nextDoc(或nextState) var data = db.collection('data'); var myCursor = data.find({}); myCursor.sort({'State': 1, 'Temperature': -1}); var nextDoc = myCursor.nextObject( func
nextDoc
(或nextState
)
var data = db.collection('data');
var myCursor = data.find({});
myCursor.sort({'State': 1, 'Temperature': -1});
var nextDoc = myCursor.nextObject( function (err, doc) {
if (err) throw err;
});
myCursor.each( function (err, doc) {
if(err) throw err;
if(doc == null) {
return db.close();
}
var currState = doc.State;
var nextState = nextDoc;
console.log("currState:" + currState + " nextState:" + nextState);
});
好吧,如果你仔细想想,在执行过程中,你将到达查询结果的“末尾”,而不会有“下一个”文档,那么请求“下一个”文档真的没有多大意义 因此,更好的方法是“保留”最后一个结果,然后与当前项进行比较。逻辑也很简单,因为第一个没有什么可比较的,所以没有什么意义。但其他一切都很好 这里的首选方法是使用最新驱动程序中本机提供的(否则调用
.stream()
),因为在您可能需要执行其他操作(如.update()
或其他异步操作)时,这里有更多的控制:
var data = db.collection('data');
var myCursor = data.find({});
myCursor.sort({'State': 1, 'Temperature': -1});
var prevState = null;
myCursor.on("err",function(err) {
throw err;
});
myCursor.on("end",function() {
db.close();
});
myCursor.on("data",function(data) {
myCursor.pause(); // stops other events emitting
if ( prevState != null ) {
console.log("prevState: %s currState %s",prevState,data.State);
}
prevState = data.State;
myCursor.resume(); // Restart when finsihed with document
});
那里的.pause()
和.resume()
方法确保每次迭代都考虑范围外的变量,因为在恢复之前不会发出更多的“数据”事件
当然,如果您确实执行了一个异步进程,那么应该在它的回调函数中调用.resume()
,以确保在处理完成之前“循环”不会继续
因此,它只是从另一个角度看问题,回头看而不是向前看,这是游标和流很乐意做的事情。好吧,如果你想一想,要求“下一个”文档真的没有多大意义,因为在执行过程中,你很快就会到达“结束”而不会有“下一步” 因此,更好的方法是“保留”最后一个结果,然后与当前项进行比较。逻辑也很简单,因为第一个没有什么可比较的,所以没有什么意义。但其他一切都很好 这里的首选方法是使用最新驱动程序中本机提供的(否则调用
.stream()
),因为在您可能需要执行其他操作(如.update()
或其他异步操作)时,这里有更多的控制:
var data = db.collection('data');
var myCursor = data.find({});
myCursor.sort({'State': 1, 'Temperature': -1});
var prevState = null;
myCursor.on("err",function(err) {
throw err;
});
myCursor.on("end",function() {
db.close();
});
myCursor.on("data",function(data) {
myCursor.pause(); // stops other events emitting
if ( prevState != null ) {
console.log("prevState: %s currState %s",prevState,data.State);
}
prevState = data.State;
myCursor.resume(); // Restart when finsihed with document
});
那里的.pause()
和.resume()
方法确保每次迭代都考虑范围外的变量,因为在恢复之前不会发出更多的“数据”事件
当然,如果您确实执行了一个异步进程,那么应该在它的回调函数中调用.resume()
,以确保在处理完成之前“循环”不会继续
因此,它只是从另一个角度看问题,回头看而不是向前看,这是游标和流乐于做的事情。我最后做了这样的事情:doc.forEach(函数(docs){if(newstate!=docs.State){newstate=docs.State;query[''u id']=docs[''u id'];var operator={'$set':{'month_high':true}};db.collection('data').update(查询、运算符、函数(err,updated){if(err)throw err;console.dir(“成功更新”+updated+“document!”;}其中
var newstate=“”
在前面的一行中,我最后做了这样的事情:doc.forEach(函数(docs){if(newstate!=docs.State){newstate=docs.State;query[''u id']=docs[''u id'];var操作符={'$set':{'month\u high':true};db.collection('data')。update(查询,操作符,函数)(err,updated){if(err)throw err;console.dir(“已成功更新”+updated+“document!”);}}其中var newstate=“”;
位于前一行