Javascript 如何使用node.js在MongoDB中查找下一个文档

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

理想情况下,我希望能够比较cursor对象和以下cursor.next()对象的数据,以便执行其他函数

以下代码导致未定义
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=“”;
位于前一行