使用node.js检索用于mongo查询的副本实例
我使用官方的node.js mongodb客户端 ,通过类似于以下连接string的集群执行Mongo查询: mongodb://euwest1-01,euwest1-02,uswest2-01/dbname?replicaSet=mycluster&readPreference=nearest
。 正如你所看到的,我在我的集群中包含一些不同的地理位置实例,“最近的”应该保证select正确的副本。
不过,我想知道哪一个被用来执行任何查询,以便我可以在每个操作日志中包含用于执行查询的mongo副本。
对光标对象进行黑客攻击,我可以用黑客的方式得到我想要的东西:
const find = (query, callback) => { let cursor = coll.find(query); cursor.toArray((err, items) => { console.log(cursor.server.ismaster.me); callback(err, items); }); };
但是我觉得这样可以在任何时候打破,因为没有logging+它似乎仅限于光标的相互作用(所以我不知道如何实现一个findOne
方法相同)。
有谁知道一个干净的方法来做到这一点?
您可能有兴趣使用APM界面。
http://mongodb.github.io/node-mongodb-native/2.2/reference/management/apm/
这使您可以访问由驱动程序运行的每个操作的上下文,并且确实适用于APM提供程序,但如果要跟踪或logging操作执行的方式,可能对您有用。
var listener = require('mongodb').instrument({ operationIdGenerator: { operationId: 1, next: function() { return this.operationId++; } }, timestampGenerator: { current: function() { return new Date().getTime(); }, duration: function(start, end) { return end - start; } } }, function(err, instrumentations) { // Instrument the driver }); listener.on('started', function(event) { // command start event (see https://github.com/mongodb/specifications/blob/master/source/command-monitoring/command-monitoring.rst) }); listener.on('succeeded', function(event) { // command success event (see https://github.com/mongodb/specifications/blob/master/source/command-monitoring/command-monitoring.rst) }); listener.on('failed', function(event) { // command failure event (see https://github.com/mongodb/specifications/blob/master/source/command-monitoring/command-monitoring.rst) });
我想这不是最好的解决scheme,但你可以使用.eval()函数来创build一个返回server_info&result的函数,如下所示:
db.getCollection('mycollection').eval(function construct(){ var res = db.getCollection('mycollection').find(query); var explain = res.explain()['server']; return {'server':explain,'result':res.toArray()}; })()
它返回类似于:
{ "server" : "myservernode.mydomain:27017", "result" : [ // your query results ] }