gpt4 book ai didi

javascript - 如何使用 Node.js 在 MongoDB 中查找下一个文档

转载 作者:太空宇宙 更新时间:2023-11-04 02:23:03 24 4
gpt4 key购买 nike

理想情况下,我希望能够比较光标对象和后面的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 interface它原生地出现在最新的驱动程序中(否则调用 .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(),以确保“循环”在处理完成之前不会继续。

因此,它只是以相反的方式看待问题,向后看而不是向前看,这是游标和流很乐意做的事情。

关于javascript - 如何使用 Node.js 在 MongoDB 中查找下一个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com