gpt4 book ai didi

node.js - 从同一个客户端取消之前的 MongoDB 操作

转载 作者:可可西里 更新时间:2023-11-01 09:36:39 24 4
gpt4 key购买 nike

我有一个包含 3257477 个城市的 MongoDB 集合,我在 NodeJS 上使用 Mongoose 来访问它。我反复向它发出请求(每 500 毫秒一次)。请求通常会很快得到答复。但是,当我输入错误时,查询会花费很长时间并且请求开始堆积,直到初始请求得到答复。以下是我收集的请求和响应的一些日志:

21:48:50    started query for "new"
21:48:50 finished query for "new"
21:48:52 started query for "newj ljl" // blockage
21:48:54 started query for "newj"
21:48:55 started query for "new"
21:48:57 started query for "new ye"
21:48:59 started query for "new york"
21:49:08 finished query for "newj ljl" // blockage removed, quick queries flood in
21:49:08 finished query for "new"
21:49:08 finished query for "new york"
21:49:08 finished query for "new ye"
21:49:23 finished query for "newj"

我能够取消客户提出的请求,所以我不担心查询以错误的顺序返回。我现在对如何加快查询速度不感兴趣,因为对实际正确拼写的查询很快。

我想知道新请求如何取消同一客户发出的旧请求。换句话说 "newj ljl""newj" 时被取消到达,"newj""new" 时被取消到达,等等。如果它只是被扔掉,为什么要绑定(bind)数据库?

有没有正确的方法来做到这一点?

更新:

我知道 db.currentOp().inprog 我想我可以使用 client 该数组中文档的属性以了解它是否是重复请求,但我不太清楚如何从 Mongoose 访问它。我也不确定何时 这样做,或者我如何知道哪个请求是从这个 客户端生成的(因此要取消哪个)。我想要一个使用 Mongoose 的实际代码示例,或者如果可能的话,使用 native NodeJS MongoDB 驱动程序!

下面是一些示例代码:

models.City.find({ ... })
.exec(function (err, cities) {

});

最佳答案

下面是我想出的解决问题的方法。

我可以轻松地从 Mongo shell 执行 db.currentOp().inprogdb.killOp(),但我真的需要它自动发生,当它需要,来自 Mongoose。由于您可以使用 require('mongoose').connection.db 引用 MongoDB 驱动程序,因此您可以通过对以下集合执行“查询”来执行这些命令:

db.collection('$cmd.sys.inprog');
db.collection('$cmd.sys.killop');

完整的解决方案:

var db = require('mongoose').connection.db,
// get the client IP address
ip = request.headers['x-forwarded-for'] ||
request.connection.remoteAddress ||
request.socket.remoteAddress ||
request.connection.socket.remoteAddress;

// same thing as db.currentOp().inprog
db.collection('$cmd.sys.inprog').findOne(function (err, data) {
if (err) throw err;

data.inprog.filter(function (op) {
// get the operation's client IP address without the port
return ip == op.client.split(':')[0];
}).forEach(function(op){
// same thing as db.killOp()
db.collection('$cmd.sys.killop')
.findOne({ 'op': op.opid }, function (err, data) {
if (err) throw err;
});
});

// start the new cities query
models.City.find({ ... })
.exec(function (err, cities) {

});
});
有用的网址:

关于node.js - 从同一个客户端取消之前的 MongoDB 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21471982/

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